CubeMX与STM32的Keil开发基础

CubeMX与STM32的Keil开发基础GPIO 的典型 HAL 函数初始化引脚工作模式 void HAL GPIO Init GPIO TypeDef GPIOx GPIO InitTypeDef GPIO Init CubeMX 设置中已图形化配置 不动

欢迎大家来到IT世界,在知识的湖畔探索吧!

GPIO的典型HAL函数

初始化引脚工作模式

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

CubeMX设置中已图形化配置,不动。

引脚复位

void HAL_GPIO_DeInit(GPIO_Ty peDef *GPIOx, uint32_t GPIO_Pin);

初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值。

读取电平

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

按键触发:一端通过电阻上拉到高电平,一端接地。STM32内部自带上拉电阻(MX中Input设为上拉)。持续扫描或外部中断。扫描需要延时去抖动。

翻转电平

void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

输出信号

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

其中,GPIOx为目标引脚端口号,GPIO_Pin为目标引脚编号,PinState为电平状态。高电平——GPIO_PIN_SET,低电平——GPIO_PIN_RESET。(和CubeMX默认设置无关?

E.G.

if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET)

{

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);

While(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)==GPIO_PIN_RESET)

}

宏定义

用定义缩写替代原命令

#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)

中断系统

概念

中断、中断源、中断向量、优先级、服务函数

STM32中断通道、中断函数服务可能被多个中断源共用。在中断服务函数入口要设计判断机制。

每个中断都要指定抢占优先级响应优先级

每个中断源要给定中断号。内核提供嵌套向量中断控制器NVIC设备。

外部中断

外部中断EXTI是STM32芯片实时处理外部事件的一种机制,请求来自于GPIO引脚。

STM32有16个外部中断源EXTI0~EXTI15,对应7个中断向量。0-4专用,5-9共用,10-15共用。

EXTI0的连接引脚为PA0~PG0,以此类推。

CubeMX与STM32的Keil开发基础

触发条件:上升沿、下降沿、双边沿触发。不能配置为高/低电平触发。

传统外部中断程序设计:(1)GPIO初始化为输入端口;(2)配置引脚与中断线的映射关系;(3)设置引脚对应的中断触发条件;(4)配置NVIC,使能中断;(5)编写中断服务函数。

传统外部中断程序设计:(1)CubeMX中置顶引脚并配置中断初始化参数(GPIO_EXTI);(2)重写引脚对应的中断回调函数。/在stm32xx_it.c中找到EXTI_IRQHandler函数,右键寻源找到CallBack,继续右键寻源找到虚函数。拷贝到main中重写。

定时器

定时器资源

系统滴答定时器SysTick,看门狗WatchDog,实时时钟RTC,基本定时器,TIM6、TIM7,通用定时器TIM2-5,高级定时器TIM1、TIM8。其中,SysTick集成在M内核中,给RTOS提供时钟节拍做时间基准。通用定时器在基本定时器的基础上,实现输出比较、输入捕获、PWM生成、单脉冲模式输出等功能。

STM32通用定时器

可以对内部时钟或触发源以及外部时钟或触发源进行计数。本质为加法计数器。

定时时间=(可编程预分频器Prescaler+1)x(主计数器Counter Period+1)x1/定时器时钟频率

CubeMX与STM32的Keil开发基础

TIM的MX配置过程:(1)设置Clock时钟源,一般使用内部时钟源;(2)在参数设置中设置Prescaler和Counter Period参数,如Prescaler=31999,Counter=499,Mode=Up;(3)设置NVIC嵌套向量中断控制器,使能。

定时器溢出回调虚函数:__weak void HAL_TOM_PeropdElapsedCallBack()

需要判断定时器实例:if(htim->Instance == TIM2)

在main()函数中启动相应的定时器,虚函数为stm32c8xx_hal_tim.c中HAL_TIM_BASE_START。

实例名称在tim.c中,如htim2、htim3。

串口收发

CubeMX配置

CubeMX与STM32的Keil开发基础

串口发送

阻塞式发送函数:HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size, uint32_t Timeout);推荐

非阻塞式发送函数:HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size);

发送完毕中断回调函数:void HAL_UART_TxCpltCallBack(UART_Handle TypeDef *huart);

发送一半中断回调函数:void HAL_UART_TxHalfCallBack(UART_Handle TypeDef *huart);

非阻塞发送EG

uint8_t Tx_str1[] = ‘Hello World!\r\n’;

HAL_UART_Transmit_IT(&huart1, Tx_str1, sizeof(Tx_str1));

void HAL_UART_TxCpltCallBack(UART_Handle TypeDef *huart)

{

if(huart->Instance == USART1)

{

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);

}

}

阻塞发送EG

HAL_UART_Transmit(&huart1, dat_Txd, 5,10000);

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);

串口接收

阻塞式接收函数:HAL_StatusTypeDef HAL_UART_Recieve(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size, uint32_t Timeout);

非阻塞式接收函数:HAL_StatusTypeDef HAL_UART_Recieve_IT(UART_HandleTypeDef *huart, uint8_t *pData, unint16_t Size); 推荐

接收完毕中断回调函数:void HAL_UART_RxCpltCallBack(UART_Handle TypeDef *huart);

接收一半中断回调函数:void HAL_UART_RxHalfCallBack(UART_Handle TypeDef *huart);

非阻塞接收EG

uint8_t dat_Rxd = 0;

HAL_UART_Recieve_IT(&huart1, dat_Rxd, 1);

void HAL_UART_RxCpltCallBack(UART_Handle TypeDef *huart)

{

if(huart->Instance == USART1)

{

if(dat_Rxd == 0x5A)

{

HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);

}

}

}

sprinf函数

#include “stdio.h”

uint8_t Str_buff[64];

sprintf((char*)Str_buff,”温度为:%d摄氏度”,tmp);

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/86583.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信