STM32开发手记
2015年1月2日,周五,下午10时57分
由于最近公司开发需要用到STM32,所以今天准备自学STM32,因为之前搞过51、ARM,对于STM32还没有一点了解,虽然听别人说了很简单,但是毕竟没有接触过,只是了解到了开发有寄存器的方式和固件库的方式,由于本人对寄存器的方式情有独钟,所以毅然选择寄存器的方式学习,在网上搜了很多资料,准备自己把自己的开发笔记记录下来,从零开始!!!
千篇一律,学习单片机最先的、最伟大的工程,跑马灯。就像hello word一样。
1.芯片STM32F103C8,64pin,一共两组,每一组16个IO
2.电路的原理:PB0连接LED,LED低电平点亮。使LED闪烁。
使用杜邦线将PB0与一路的LED相连接,将PB0拉低点亮LED,拉高熄灭LED。
所以程序流程图如下:
3.IO初始化,参考资料:《STM32中文参考手册_V10》
STM32的IO设置相对于51来说麻烦了一些:
1>设置IO是输入还是输出模式,输入模式下面又分模拟输入、浮空输入等等,输出模式分通用的推挽输出,复用的开漏输出等等,详细配置如下图:
我们需要点亮LED,所以IO自然设置为输出模式,图中每四位决定一个IO的模式,例如我们需要用PB0来控制LED的亮灭,我们需要设置PB0为通用的推挽输出模式,即GPIOB->CRL的bit[3:0]为0011,所以对应的设置如下:
GPIOB->CRL = 0X00000003;
2>设置完输出模式还需要设置输出的电平的高低。高电平熄灭,低电平点亮,所以对应的寄存器如下图:
所以:
GPIOB->ODR = 0X00000001;//使PB0输出高电平
3>目前需要的IO配置已经完成?未必,缺少一个重要的配置:RCC->APB2ENR(外设时钟使能寄存器)。
外部时钟的控制在运行模式下,任何时候都可以通过停止为外设和内存提供时钟(HCLK和PCLKx)来减少功耗。
为了在睡眠模式下更多地减少功耗,可在执行WFI或WFE指令前关闭所有外设的时钟。
通 过 设 置 AHB 外 设 时 钟 使 能 寄 存 器 (RCC_AHBENR) 、 APB2 外 设 时 钟 使 能 寄 存 器(RCC_APB2ENR)和APB1 外设时钟使能寄存器(RCC_APB1ENR)来开关各个外设模块的时钟。
总之一句话:用到什么接口就使能对应接口的时钟,用不到就不要去操作对应的时钟以减少功耗。
RCC->APB2ENR配置如下:
RCC->APB2ENR = 1<<3;
寄存器如下图:
源代码:
#include <stm32f10x.h>
void IO_init()
{
/* 使能IO口的时钟 */
RCC->APB2ENR = 1<<3;
/* IO口的配置 */
GPIOB->CRL = 0X00000003;//设置为通用的推挽输出
}
void delay_us(int timer)
{
int i = 0;
while(timer--)
{
i = 10;
while(i--);
}
}
void delay_ms(unsigned int timer)
{
unsigned int i = 0;
while(timer--)
{
i = 12000;
while(i--);
}
}
int main()
{
IO_init();
while(1)
{
GPIOB->ODR = 0X00000001;//拉高PB0熄灭
delay_ms(50);
GPIOB->ODR = 0X00000000;//拉低PB0点亮
delay_ms(50);
}
}