CubeMX与STM32的Keil开发基础

1,229次阅读
2 条评论

共计 3184 个字符,预计需要花费 8 分钟才能阅读完成。

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 内部自带上拉电阻 (MXInput设为上拉)。持续扫描或外部中断。扫描需要延时去抖动。

翻转电平

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 设备。

外部中断

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

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

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

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

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

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

定时器

定时器资源

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

STM32通用定时器

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

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

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

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

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

main() 函数中启动相应的定时器,虚函数为 stm32c8xx_hal_tim.cHAL_TIM_BASE_START

实例名称在 tim.c 中,如htim2htim3

串口收发

CubeMX配置

串口发送

阻塞式发送函数: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);

正文完
 0
R3默秒全
版权声明:本站原创文章,由 R3默秒全 2021-12-27发表,共计3184字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(2 条评论)
Avatar photo
2021-12-29 17:50:54 回复

虽然看不懂,但是看起来很牛逼的样子就对了 :drooling:

 Windows  Edge
    Avatar photo
    2021-12-29 17:52:43 回复

    前置笔记,正在试着自己做焊台和红外成像系统

     Windows  Edge