|
前两天看了马老师的STM32学习笔记后,重新拿起了我的万利STM32开发板。
工作平台是MDK3.70,使用的是config wizard模式。
首先说下我的实际目标, 通过在main里面,直接点亮一个LED,简单的io输出控制
使用一个定时器,开控制一个LED的亮灭。学会通过wizard模式配置定时器
通过两个按键,来控制一个LED的关闭。学会通过wizard模式使用中断。
首先IO的输出配置是很简单,我直接从马老师的程序里面拷贝过来的。是直接给对应的IO地址赋值, GPIOC->ODR |=BIT6;
每个IO口有下面几个寄存器
GPIO->CRL 端口配置寄存器低位 7-0
GPIO->CRH 端口配置寄存器高位 15-8 (如果在程序中不发生变化,这部分只要在wizard里面配置就可以,如果IO的输入输出发生变化,只要在
这部分修改就可以了)
GPIO->IDR 输入寄存器,设置为输入后,可以直接读出来。
GPIO->ODR 输出寄存器,当设置端口为输出后,只要写入值后,对应的io就会输出了
(因为习惯使用msp430,所以将管脚改成了类似430里面的BIT形式。我对单片机程序最大的想法就是所有的程序都是用类似的控制方式)
很简单吧,只要在程序里这么写 GPIOC->ODR |=GPIO_Pin_9 ; 就是将PC.9置高了,如果要置0,则是GPIOC->ODR &=~(GPIO_Pin_9);
下面就是关于定时器了
在使用wizard的时候,定时器的配置就简单多了,需要那个定时器,就直接到wizard里面选择对应的部分了,看图
(原文件名:未命名.jpg)
配置好了后,就可以直接编写中断子程序了,具体的中断子程序的格式可以直接到使用库的里面那个stm32f10x_it.c文件下面去找。如果是定时器1
则选中
void TIM1_UP_IRQHandler (void)
{
}
在进入中断后,有个很重要的事情一定要注意,那就是清除中断标志,具体的中断标志在什么地方,一开始我没有找到,后来我想既然给了demo,就可以到demo里面找这些中断使用的例子,因为这些例子里面就有怎样推出中断的函数,但因为是用库文件写的,所以还得打开库文件里面对应的.c,然后找到具体的函数,看到里面的寄存器使用方法,而在定时器的中断标志是
TIM1->SR &= ~(1<<0); //我直接拷贝过来,没有仔细看。
/*------------------------------------------------------------------------------
Timer1 Update Interrupt Handler
*------------------------------------------------------------------------------*/
void TIM1_UP_IRQHandler (void) {
if ((TIM1->SR & 0x0001) != 0) { // check interrupt source
if(flag_led)
{
flag_led=0;
GPIOC->ODR &=~(BIT5);
GPIOC->ODR |=BIT4;
}
else
{
flag_led=1;
GPIOC->ODR |=BIT5;
GPIOC->ODR &=~(BIT4);
}
TIM1->SR &= ~(1<<0); // clear UIF flag
}
} // end TIM1_UP_IRQHandler
最后写按键中断的编写:
首先是确定按键接的io口且需要中断,这个时候io口的配置有两个地方,一个就是GPIO的配置,第二个就是extern interrupt/event configuration里面
因为我使用的是万利的板子,key是在PD3,PD4,所以我先要在GPIO里面设置PD只用,然后再PIN3和PIN4里面设置输入,里面有float和pull up/down ,我使用按键是区别不是很大,但应该还是有不同的。
在按键设置为输入后,再在中断里面进行中断配置,extern。。里面的配置有16,代表了16个pin,每个EXTIx可以从PA-PG里面选择对应的x,要记得选择上打开中断,中断是上升沿还是下降沿
(原文件名:未命名.jpg)
在配置完成后,就是EXIT中断的编写,这个和上面的类似,直接拷贝过来就可以。
void EXTI4_IRQHandler(void)
{
GPIOC->ODR &=~(BIT7);
EXTI->PR = EXTI_Line4;//这一句是中断标志清除语句,这里面和的EXTI_Linex和中断函数里的一样,x可以从0-15
}
好了,先写这么多吧,上程序,嘿嘿,程序是从马老师的改过来的,大家看看。
还有对定时器的一点疑问,我的定时时间在100000以上时,LED可以正常的闪,但当小于这个值的,就会闪几次后,停下来,具体原因不是很明白,如果马老师看到了,能麻烦帮我看一下吗? 先谢谢了。
点击此处下载 ourdev_480027.rar(文件大小:376K) (原文件名:STM32_GPIO.rar) |
|