初次接触到stm32,感觉到手足无措的感觉,于是拿着代码照着写,发现还是能够熟悉起来的。
使用stm32芯片的时候,对于标准库函数和芯片技术手册要足够的熟悉。
在stm32上写一个流水灯的程序,流程和51单片机差不多,步骤如下:
1. 初始化GPIO口。(查看原理图,为相应GPIO口配置时钟)
2. 延时初始化,这是为了delay函数做准备,准确知道自己延时多久。使用SysTick来进行计数。
3. 设置GPIO的模式,GPIO口可以软配成8种模式:
输入浮空、
输入上拉、 输入下拉、模拟输入、开漏输出、 推挽输出、
推挽式复用功能、开漏复用功能。这里我们使用的推挽输出。
4.使用GPIO_SetBits()和GPIO_ResetBits()函数进行高低电平的控制输出
这就是一个流水灯程序的大概流程。
下面给出代码:
#include "stm32f10x.h"
static u8 fac_us;
static u16 fac_ms;
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE,ENABLE); // led0 PB5 led1 PE5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
}
void delay_init()
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
fac_us = SystemCoreClock/8000000;
fac_ms = (u16)fac_us*1000;
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = nms*fac_ms;
SysTick->VAL = 0x0;
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
do
{
temp = SysTick->CTRL;
}while(temp&0x01 &&!(temp&(1<<16)));
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
SysTick->VAL = 0x0;
}
void delay_us(u16 nus)
{
u32 temp;
SysTick->LOAD = nus*fac_us;
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 = 0x0;
}
int main()
{
delay_init();
led_init();
while(1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
delay_ms(500);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay_ms(500);
}
}