ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32学习笔记(二)

2022-01-19 22:30:41  阅读:160  来源: 互联网

标签:学习 端口 笔记 STM32 while us 延时 SysTick GPIO


1. 核心板电路

电路各部分:

  • 单片机最小系统电路:包括单片机,主晶振,起振电容,RC复位电路

  • USB转串口电路(CH340芯片):负责将USB协议信号转换成单片机能处理的USTART串口通信

  • ASP自动下载电路:负责检测串口数据,实现自动下载功能

  • MicroUSB 接口:连接电脑,为核心板提供5V电源输入和串口通信

  • 电源电路:为核心板提供5V和3.3V稳定电压

  • 功能电路:含有LED、按键、蜂鸣器、RTC走时等附加功能

各元件作用:

  • 滤波电容:去除电源电压的波动干扰

  • 起振电容:帮助晶体振荡器稳定的工作

  • 继电器:核心板的电源总开关

  • RTC晶振:为单片机内部的RTC时钟提供32.768kHz频率的时钟基准

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

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

#include "sys.h"

关于初始化:

LED_Init();

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

初始化内容包括:

  • 输入还是输出(接口工作模式)

  • 端口号(比如:GPIO_PIN_ 1)

  • 输出速率(2/10/50MHz)比如:GPIO_Speed_20MHz

  • 启动GPIO端口

  • 设置IO端口组

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有