其他分享
首页 > 其他分享> > STM32学习笔记(二)

STM32学习笔记(二)

作者:互联网

1. 核心板电路

电路各部分:

各元件作用:

2.点亮LED灯(用库文件)

PS:需要先链接sys.h文件

#include "sys.h"

关于初始化:

LED_Init();

所有I/O端口使用前必须初始化

初始化内容包括:

GPIO_Init(GPIOB, &GPIO_InitStructure);

即把GPIO_InitStructure结构体里设置的数据赋值给GPIOB端口,然后进行初始化。

方法一:GPIO_WriteBit函数

核心语句:

while(1){
    GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1)) //LED1端口输出高电平
    GPIO_WriteBit(LEDPORT,LED2,(BitAction)(0)) //LED2端口输出低电平
}

这里使用了库函数:GPIO_WriteBit函数

参数1:使用哪一组端口

参数2:使用这一组里的第几号端口

参数3: BitAction是一个枚举变量,在括号中设置的值可赋值给这个枚举变量。

这里参数3也可以直接换成Bit_RESET或者Bit_SET,分别表示清零和置1

详见STM32固件库使用手册P120

方法二:GPIO_ResetBits函数

GPIO_ResetBits(GPIOA,GPIO_Pin_10);

即把GPIOA组的GPIO_Pin_10端口清零

方法三:GPIO_SetBits函数

GPIO_SetBits(GPIOA,GPIO_Pin_11);

即把GPIOA组的GPIO_Pin_11端口置1

方法四:GPIO_Write函数

GPIO_Write(GPIOA,0x0001); //直接把GPIOA这一组的端口变量都赋值为1
GPIO_Write(GPIOB,0x0000); //直接把GPIOB这一组的端口变量都赋值为0

不建议使用这种全部赋值的方法

PS:直接操作寄存器法

需要多层宏定义嵌套,然后最底层的定义变量直接对寄存器地址进行操作。一般板子厂家会提供。

3.LED闪灯程序

主要就是利用延时函数,在开灯和关灯之间加入延时即可看到闪灯效果。

延时函数如下:

delay_us();    //微秒级延时函数,括号里即可填入延时时间
delay_ms();    //毫秒级延时函数,括号里即可填入延时时间

方法一:普通延时法

微秒级延时函数:

void delay_us(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=10;  //自己定义
      while(i--) ;    
   }

毫秒级延时函数:

void delay_ms(u16 time)
{    
   u16 i=0;  
   while(time--)
   {
      i=12000;  //自己定义
      while(i--) ;    
   }
}

即利用for循环,一直倒计时计数,直到为0跳出循环往下执行

优点:比较简单,容易理解与使用

缺点:不是很精准

方法二:SysTick库函数

通过系统的滴答定时器完成,可以精密延时

滴答计时器:本质是倒计时计时器

SysTick库函数详见STM32固件库使用手册P238

第一步:重计数初值

这里涉及到单片机的主频(AHB_INPUT)

主频:指计数为多少时为1ms

比如:主频是72MHz,则计数72次为1ms

#define AHB_INPUT 72    //定义主频
u32 us        //定义延时时间长度,即us
SysTick->LOAD = AHB_INPUT * us;  //即把主频乘以延时时间长度,然后这个值赋值给滴答定时器SysTick里的时间计时器LOAD里

第二步:打开定时器

SysTick->CTRL = 0X00000005;

第三步:等待计数到0

while(!(SysTick->CTRL&0X00010000));

当 SysTick->CTRL 的值不为0时,一直进入while的循环

直到 SysTick->CTRL 的值为0是,才跳出循环,往下执行

第四步:关闭计时器

SysTick->CTRL = 0X00000004;

完整延时函数:

微秒级延时函数:

#define AHB_INPUT 72  
void delay_us(u32 us){
    //重装计数初值
	SysTick->LOAD = AHB_INPUT * us; 
    //打开定时器
	SysTick->CTRL = 0X00000005;
    //等待计数到0
	while(!(SysTick->CTRL&0X00010000));
	//关闭定时器
    SysTick->CTRL = 0X00000004;
}

毫秒级延时函数:

void delay_ms(u16 ms){
	while(ms-- != 0){
		delay_us(1000);    //调用1000us的延时
	}
}

标签:学习,端口,笔记,STM32,while,us,延时,SysTick,GPIO
来源: https://blog.csdn.net/weixin_52324498/article/details/122591314