STM32学习笔记(二)

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的延时
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Emiyasama555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值