历史上的今天
返回首页

历史上的今天

今天是: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)


推荐阅读

史海拾趣

HDP_Power公司的发展小趣事

关于电蚊拍的基本电路,网友可能提出的问题及回答如下:

问题一:电蚊拍的基本电路由哪些部分组成?

回答:电蚊拍的基本电路主要由三个核心部分组成:阻容降压电路(或称为高频振荡电路)、倍压整流电路以及高压电击网。

  1. 阻容降压电路(高频振荡电路):这部分电路主要负责将直流电源(如电池提供的3V直流电)转换为高频交流电,通常频率在18kHz左右。这一转换过程由三极管和变压器等元件共同完成,通过变压器的升压作用,将电压提升到数百伏。

  2. 倍压整流电路:高频交流电经过升压后,进入倍压整流电路。这个电路通过多个二极管和电容的组合,将电压进一步升高到足以电击蚊虫的水平,通常可达到1500V左右。常见的倍压整流电路有三倍压、四倍压等多种连接方式。

  3. 高压电击网:高压电击网是电蚊拍的输出部分,由细密的金属网格构成。当蚊虫接触到金属网格时,会形成电路通路,导致蚊虫被高压电击死。

问题二:为什么电蚊拍使用一段时间后,电击效果会变差?

回答:电蚊拍使用一段时间后电击效果变差的原因可能包括以下几点:

  1. 电容老化:电蚊拍中的倍压电容(如CBB电容)在频繁充放电过程中会逐渐老化,其容量会逐渐下降,导致储能能力降低,从而影响电击效果。

  2. 元件损坏:电蚊拍中的二极管、三极管等元件在长时间使用后可能出现损坏或性能下降,导致电路无法正常工作或电压无法升到足够高的水平。

  3. 电池电量不足:电池是电蚊拍的能量来源,如果电池电量不足,将直接影响电蚊拍的电击效果。

  4. 金属网格污染或变形:金属网格在使用过程中可能会受到污染或变形,导致接触不良或短路,从而影响电击效果。

问题三:如何判断电蚊拍是否需要维修?

回答:可以通过以下几种方法来判断电蚊拍是否需要维修:

  1. 观察指示灯:如果电蚊拍的指示灯不亮或亮度明显降低,可能是电池电量不足或电路存在故障。

  2. 检查电击效果:如果电蚊拍在使用时电击效果变差或无法电击蚊虫,可能是电路中的元件损坏或老化。

  3. 测量电压:使用万用表等工具测量电蚊拍输出端的电压,如果电压明显低于正常值(如1500V左右),则说明电路存在问题。

  4. 检查金属网格:观察金属网格是否干净、平整、无变形或短路现象。

问题四:如何维修电蚊拍?

回答:维修电蚊拍需要一定的电子知识和技能,以下是一些基本的维修步骤:

  1. 检查电池:首先检查电池是否电量充足且接触良好。如果电池电量不足,应及时更换新电池。

  2. 清洁金属网格:使用软布或棉签等工具清洁金属网格上的污垢和灰尘。

  3. 检查并更换元件:如果确定是电路中的元件损坏导致的问题,应使用万用表等工具检测并更换损坏的元件。常见的损坏元件包括二极管、三极管、电容等。

  4. 调整电路:在更换元件后,可能需要调整电路中的某些参数(如电阻值、电容容量等)以确保电路能够正常工作。

  5. 测试电击效果:在维修完成后,应使用万用表等工具测试电蚊拍的电击效果是否恢复正常。

请注意,由于电蚊拍内部涉及高压电路,因此在维修过程中应确保安全操作,避免触电等危险情况的发生。如果不具备相关知识和技能,建议将电蚊拍送至专业维修机构进行维修。

ALLTHREAD公司的发展小趣事

ALLTHREAD公司最初由一群对螺纹轧制技术充满热情的工程师创立。他们看到了电子行业对高精度螺栓的迫切需求,于是决定专注于这一领域。经过不断的研发和创新,ALLTHREAD成功推出了首款高精度、高可靠性的螺纹轧制螺栓,迅速在市场上获得了认可。

Big-Sun Electronics Co Ltd公司的发展小趣事

Big-Sun Electronics Co Ltd公司自成立以来,始终致力于技术研发和产品创新。在成立初期,公司便投入大量资源于研发部门,通过不断试验和改进,成功研发出了一款具有高效能、低能耗特点的电子芯片,这一技术突破迅速在市场上引起了广泛关注。随着产品线的不断扩展,Big-Sun的电子产品逐渐在行业内树立起了技术领先的形象。

CBM_America_Corporation公司的发展小趣事

CBM_America_Corporation在电子行业的初期,专注于研发具有创新性的半导体技术。通过不懈的努力,公司成功开发出一种高效能、低能耗的芯片,受到了市场的广泛欢迎。这一技术突破为公司带来了大量的订单,也吸引了众多投资者的关注。随着资金的注入,CBM开始扩大生产规模,并进军国际市场,逐步成为了电子行业的领军企业。

ANADIGICS公司的发展小趣事

随着环保意识的提高,CBM_America_Corporation开始关注自身的社会责任和可持续发展。公司积极采用环保材料和生产工艺,减少了对环境的污染。同时,CBM还参与了多项公益事业,为社会做出了积极贡献。这些举措不仅提升了公司的社会形象,还吸引了更多消费者的关注和支持。在可持续发展的道路上,CBM不断前行,为电子行业的绿色发展树立了榜样。

这些故事虽然是虚构的,但它们反映了电子行业中公司可能经历的一些典型情况和挑战。您可以根据这些故事框架进行进一步的创作和修改,以适应您特定的需求和背景。

DZUS公司的发展小趣事

在XX世纪XX年代,DZUS公司的创始人John Doe看到了航空工业对高质量紧固件的迫切需求。他凭借自己在机械工程领域的深厚造诣,设计并制造了第一款DZUS快拆紧固件。这款产品在航空工业中迅速获得了认可,为DZUS公司的发展奠定了坚实的基础。John Doe的创业精神和对品质的坚持,成为了DZUS公司的核心价值观。

问答坊 | AI 解惑

2008-2009手机热点展望

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 2007年,随着一声“手机生产核准制正式取消”的赦令,大批所谓的“黑手机”厂商如雨后春笋般破土而出,加之MTK积极的方案提供和技术支持推波助澜,大大降低了手机设计的入行门槛。手机 ...…

查看全部问答>

Lenze有没有可以连接多台电机的驱动器?

Lenze有没有可以连接多台电机的驱动器? 如题,一个驱动器连接多个电机,这需要驱动器有多个电机接口,包括多套UVW输出和多个编码器的输入,Lenze有这样的驱动器吗?其他品牌的伺服有吗?恳请高手指点,谢谢!…

查看全部问答>

I have a dream!IBM T23能否当场个X86结构的嵌入式开发板?

I have a dream! 本人闲置一台IBM T23笔记本,闲来无事,有以下想法: IBM T23能否当场个X86结构的嵌入式开发板? 请大家多多发言...…

查看全部问答>

高分急求带FIFO UART源程序!!!

小妹刚接触VHDL语言不久,求一个带FIFO UART源程序,FIFO:  8位 深度:16,求各位给个源程序,急用,谢谢!…

查看全部问答>

求助这样该如何计算总功率?

 一条生产线,用到多个200W和400W的电机,由于通用和经济的考虑变频器全都用750W的,请问这条生产线根据什么计算总功率?…

查看全部问答>

梦之旅同学EZ430系列学习笔记和智能家居系统项目之DHT11

  虽然之前有同学传了DHT11的程序,但我发现那个程序不好用,呵呵,我的在那时候也调通了,然后现在我参考下那位同学程序,优化了一下相关结构,传下我的DHT11,也说下我的DHT11开发经历,今天上传三章,呵呵,今天这项目算完结了,多谢大家关 ...…

查看全部问答>

请教:uart、can、Eth等通信接口配置好后,如何通过软件查询其是否工作正常?

本人最近用 LM3S 9B81做一个项目,需要随时应答 上位机发送的 各个端口状态查询信息,请问 假如没有数据收发,我如何反应出 各个通信端口状态是正常的呢?谢谢…

查看全部问答>

求交流假电子负载方案

现在准备电子设计竞赛,做一个电子假负载的题目,开始直流模式下的恒流恒压横阻模式已完成,但负载不能进交流,求各路大神提供一下能进交流的电子负载原理电路或方案,要测量交流电源内阻的……小弟在此谢过了。。。谢谢!做了差不多3个星期了,没想 ...…

查看全部问答>

LM3S RTX 任务处理

//*******************************************************************os_tsk_create() #include <rtl.h> OS_TID os_tsk_create (  void (*task)(void),  /* Task to create建立任务 */  U8  priority ); &n ...…

查看全部问答>