本项目中采用了STM32F103RCT6,因此,在PCB完成制作之前,有必要把STM32F103RCT6的驱动代码捋一遍,以便后续开发时,不需要在驱动上,太过耗费时间。所以这些驱动工程,就类似于一把把瑞士军刀,可以非常方便地实现各类需要实现的功能。
从箱子中找出来以前使用的开发板。选择这一款开发板的主要原因是,这个开发板和项目的板子上,用了同款MCU。
下面,将MCU上门的主要驱动捋一遍,以便在项目开发上复用。这里代码多源自于开发板,在此仅做梳理,以便后续项目回溯时,汲取一些经验。
延时
延时初始化仅仅需要2行代码,这里定义了fac_us。其中STM32采用8M时钟,系统默认倍频为9倍,因此系统默认时钟为72MHz, 经过Div8, 也就是8分频后,SysTick为9MHz; SystemCoreClock为
fac_us = 9000000/8000000, 为1.125
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //HCLK/8
fac_us=SystemCoreClock/8000000; //SYSTEMCLOCK/8
fac_ms=(u16)fac_us*1000; //ms延时时间
}
us延时
通过SysTick实现us延时
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //设置SysTick.LOAD为初始值
SysTick->VAL=0x00; //VAL清零
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //CTRL设置,开始倒计时
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
ms延时
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD=(u32)nms*fac_ms; //加载延时时间,单位ms
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始计时
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16))); //计时时间到
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //停止计时
SysTick->VAL =0X00; //清空计数器
}
GPIO操作
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE); //初始化GPIO对应时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIO初始化:pin
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO初始化:Mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO初始化:Speed
GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIO初始化;
GPIO_SetBits(GPIOA,GPIO_Pin_8); //SetBits
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //Pin
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化
GPIO_SetBits(GPIOD,GPIO_Pin_2); //SetBits
}