历史上的今天
今天是:2025年02月02日(星期日)
2020年02月02日 | STM32F429HAL库UART学习笔记
2020-02-02 来源:eefocus
UART串口通讯作为最基本通讯协议我就不多赘述。我主要用HAL库实现串口通讯,看一下配置Uart的结构一变量
这里使用了结构体嵌套
typedef struct
{
USART_TypeDef *Instance; 串口类型和串口内部控制寄存器结构体
UART_InitTypeDef Init; 定义串口输出数据类型停止位奇偶校验位的结构体
uint8_t *pTxBuffPtr; 要发送的数据的缓冲数组指针
uint16_t TxXferSize; 要发送数组大小
uint16_t TxXferCount; 发送的个数
uint8_t *pRxBuffPtr; 接受数据数组缓冲指针
uint16_t RxXferSize; 接受数组大小
uint16_t RxXferCount; 数组个数
DMA_HandleTypeDef *hdmatx; 发送的DMA配置结构体
DMA_HandleTypeDef *hdmarx; 接受的DMA配置结构体
HAL_LockTypeDef Lock; 判断数据加锁若加锁返回忙,若没加锁配置
__IO HAL_UART_StateTypeDef State; UART状态位
__IO uint32_t ErrorCode; 判断错误类型 以上三个变量都是HAL调用用户基本用不到
}UART_HandleTypeDef;
原子哥的配置函数如下,定义串口1 波特率115200,修改就很简单了
void uart1_init()
{
usart1_handler.Instance=USART1;
usart1_handler.Init.BaudRate=115200; //波特率
usart1_handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
usart1_handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
usart1_handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
usart1_handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
usart1_handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&usart1_handler); //HAL_UART_Init()会使能UART1
}
再说一下GPIO配置HAL 开了一个配置头,里面什么都没有我们用到还是要自己配置
这里他们用了_weak 和 unused()这连个语法我是这样理解的,——weak就是让给用户一个编程头免去取名字的烦恼脑,UNUESD的作用就是防止编译器warring警告变量没有使用
看一下GPIO口配置模式比F1多了好几个数据手册还说多了锁存功能其实没什么用
#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||浮空输入
((MODE) == GPIO_MODE_OUTPUT_PP) || 推挽输出
((MODE) == GPIO_MODE_OUTPUT_OD) ||开漏输出
((MODE) == GPIO_MODE_AF_PP) ||复用推挽输出
((MODE) == GPIO_MODE_AF_OD) ||复用开漏输出
((MODE) == GPIO_MODE_IT_RISING) ||外部触发上升沿触发
((MODE) == GPIO_MODE_IT_FALLING) ||外部触发下降沿触发
((MODE) == GPIO_MODE_IT_RISING_FALLING) ||外部触发
((MODE) == GPIO_MODE_EVT_RISING) || 事件管脚复用具体怎么用网上帖子很少目前不深究
((MODE) == GPIO_MODE_EVT_FALLING) ||
((MODE) == GPIO_MODE_EVT_RISING_FALLING) ||
((MODE) == GPIO_MODE_ANALOG)) 模拟输入
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
GPIO_InitTypeDef GPIO_Initure;
if(huart->Instance==USART1)//如果是串口1,进行串口1 MSP初始化
{
__HAL_RCC_GPIOA_CLK_ENABLE();//使能GPIOA时钟
__HAL_RCC_USART1_CLK_ENABLE();//使能USART1时钟
GPIO_Initure.Pin=GPIO_PIN_9;//PA9
GPIO_Initure.Mode=GPIO_MODE_AF_PP;//复用推挽输出 只要使用到复用就直接设为复用管脚否则不工作
GPIO_Initure.Pull=GPIO_PULLUP;//上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
GPIO_Initure.Alternate=GPIO_AF7_USART1;//复用为USART1这里我困惑了很久 原来是只有F4以上的板子才要配置这个复用配置F1和F3都不需要配置,直接I/O配置时给AFPP就好了,这里也是对复用端口正规了一下
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA9
GPIO_Initure.Pin=GPIO_PIN_10;//PA10
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //初始化PA10
HAL_NVIC_EnableIRQ(USART1_IRQn); //使能USART1中断通道
HAL_NVIC_SetPriority(USART1_IRQn,3,3);//抢占优先级3,子优先级3
}
}
中断优先级我的理解就是 抢占 和 顺序优先级 强占优先级高无论现在有没有中断发生只要你发生你就开始中断,不管有的中断有没有开始或正在进行。顺序优先级的作用就是两个强占优先级相同的中断到来你顺序高你先执行你执行完才执行下一个中断。
接下来开始接受数据处理函数HAL库是给了在中断内部调用函数来处理中断的,接受用的是串口结构体句柄实现的
先使能接受中断,在接收中断服务函数中真正处理函数是下面这句话
HAL_UART_IRQHandler(&usart1_handler);
这个函数处理判断是什么中断和接受数据我们要自己编写一个回调函数在回调函数我们可以处理进行判断处理方法和F1板上的方法相同
串口通讯的功能就实现了
F4的内核是没有重映射这一说的只有复用功能查表也方便了很多呢
补充一下 使用到HAL 库的一些文件是
时钟配置RCC:stm32f429xx_hal_rcc.h
GPIO配置:stm32f429xx_hal_gpio.h 时钟复用配置:stm32f429xx_gpio_ex.h
UART配置:stm32f429xx_hal_uart.h
程序中一些配置中断系统定义中断在 32f429xx.h(这个因你用的mcu的版本而定我用的是正点原子F429IGT)
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 2007年,随着一声“手机生产核准制正式取消”的赦令,大批所谓的“黑手机”厂商如雨后春笋般破土而出,加之MTK积极的方案提供和技术支持推波助澜,大大降低了手机设计的入行门槛。手机 ...… 查看全部问答> |
|
Lenze有没有可以连接多台电机的驱动器? 如题,一个驱动器连接多个电机,这需要驱动器有多个电机接口,包括多套UVW输出和多个编码器的输入,Lenze有这样的驱动器吗?其他品牌的伺服有吗?恳请高手指点,谢谢!… 查看全部问答> |
|
I have a dream!IBM T23能否当场个X86结构的嵌入式开发板? I have a dream! 本人闲置一台IBM T23笔记本,闲来无事,有以下想法: IBM T23能否当场个X86结构的嵌入式开发板? 请大家多多发言...… 查看全部问答> |
|
梦之旅同学EZ430系列学习笔记和智能家居系统项目之DHT11 虽然之前有同学传了DHT11的程序,但我发现那个程序不好用,呵呵,我的在那时候也调通了,然后现在我参考下那位同学程序,优化了一下相关结构,传下我的DHT11,也说下我的DHT11开发经历,今天上传三章,呵呵,今天这项目算完结了,多谢大家关 ...… 查看全部问答> |
|
请教:uart、can、Eth等通信接口配置好后,如何通过软件查询其是否工作正常? 本人最近用 LM3S 9B81做一个项目,需要随时应答 上位机发送的 各个端口状态查询信息,请问 假如没有数据收发,我如何反应出 各个通信端口状态是正常的呢?谢谢… 查看全部问答> |
|
现在准备电子设计竞赛,做一个电子假负载的题目,开始直流模式下的恒流恒压横阻模式已完成,但负载不能进交流,求各路大神提供一下能进交流的电子负载原理电路或方案,要测量交流电源内阻的……小弟在此谢过了。。。谢谢!做了差不多3个星期了,没想 ...… 查看全部问答> |
|
//*******************************************************************os_tsk_create() #include <rtl.h> OS_TID os_tsk_create ( void (*task)(void), /* Task to create建立任务 */ U8 priority ); &n ...… 查看全部问答> |




