STM32F429HAL库UART学习笔记

2019-07-22来源: eefocus关键字:STM32F429  HAL库  UART

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)


关键字:STM32F429  HAL库  UART

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic468705.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32 UART4,UART5配置方式
下一篇:STM32F407 上手-USART 收发数据

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

移植freeRTOS V10.2.0到stm32f103zet6

应用FPU 1、工程文件startup_stm32f40_41xxx.s 新建一个 test.c 文件,并保存在 USER 文件夹下2、工程文件夹USER 文件夹专门用来存放启动文件(startup_stm32f40_41xxx.s)、工程文件(test.uvprojx)等不可缺少的文件,OBJ 则用来存放这些编译过程中产生的中间文件(包括.hex 文件也将存放在这个文件夹里面) SYSTEM文件夹,该文件夹由 ALIENTEK 提供,可以在光盘任何一个实例的工程目录下找到3、工程分组 Target 目录树上点击右键  Manage Project Items我没改文件夹
发表于 2019-08-23
移植freeRTOS V10.2.0到stm32f103zet6

正点原子STM32F4笔记 串口使用

1、初始化时钟串口时钟,引脚时钟 RCC->AHB1ENR|=1<<0;    //使能PORTA口时钟   RCC->APB2ENR|=1<<4;  //使能串口1时钟 引脚复用初始化 GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出   GPIO_AF_Set(GPIOA,9,7); //PA9,AF7 GPIO_AF_Set(GPIOA,10,7);//PA10,AF
发表于 2019-08-23
正点原子STM32F4笔记 串口使用

STM32F407 纯寄存器操作GPIO,串口,中断(专治花里胡哨)

BSRRL设置输入输出的类型 OTYPER设置输出的速度(如果设置为输入,此步跳过) OSPEEDR如果输出速度>=50M,开启补偿单元 SYSCFG->CMPCR设置上拉下拉寄存器 PUPDR注意:IDR寄存器,(只读),对GPIO输入的读取ODR寄存器,对GPIO输出的读写BSSR寄存器,(只写),对GPIO输出,低16位,输出高电平,高16位,输出低电平//reset register GPIOx_BSRRH, write only//set register GPIOx_BSRRL, write onlyGPIO F9,F10 交替闪烁#include <stm32f4xx.h> 
发表于 2019-08-23
STM32F407 纯寄存器操作GPIO,串口,中断(专治花里胡哨)

STM32F407 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)

//Ft=定时器工作频率,单位:Mhz完整代码#include <stm32f4xx.h> #include <sys.h>#include <delay.h>int main(){  Stm32_Clock_Init(336,8,2,7); //系统时钟 delay_init(48); SCB->AIRCR = 0x05FA0000 | 0x500; NVIC->IP[29] = 0x50; //最低抢占优先级,最低响应优先级01 01  EXTI2中断   NVIC->ISER[0] |= (1<<29); //使能
发表于 2019-08-23
STM32F407 纯寄存器操作定时器,PWM,ADC(专治花里胡哨)

STM32F4 软件模拟IIC

IIC时序图//初始化IICvoid IIC_Init(void){       RCC->AHB1ENR|=1<<1;    //使能PORTB时钟        GPIO_Set(GPIOB,PIN8|PIN9,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PB8/PB9设置  IIC_SCL=1; IIC_SDA=1;}//产生IIC起始信号void IIC_Start(void){ SDA_OUT();   
发表于 2019-08-23
STM32F4 软件模拟IIC

STM32单片机(六)-STM32F103 时钟与F407时钟

STM32f103的时钟有四个来源高速外部时钟信号(HSE)、低速外部时钟信号(LSE)、高速内部时钟信号(HSI)和低速内部时钟信号(LSI),图中分别用蓝色的①~④标注。 ①HSE高速外部时钟:由外部4~16MHz的晶体或有源晶振提供,通常采用8MHz,ST三合一板上的也是8MHz。②LSI低速外部时钟:外部晶体提供,主要是给实时时钟(RTC),一般为32.768kHz。③HSI高速内部时钟:由内部RC振荡器产生的8MHz时钟,但不够稳定。④LSI低速内部时钟:内部RC振荡器产生的供给RTC的时钟,频率在30kHz~60kHz之间,通常约40kHz。时钟在STM32内部最终是供给四大块,图中用红色椭圆圈出——USB的
发表于 2019-08-23
STM32单片机(六)-STM32F103 时钟与F407时钟

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved