如何做影视剧网站,网站设计的论坛,四年级说新闻2023,注册城乡规划师考试题型目录
一、硬件及工程
1、硬件
2、软件目的
3、创建.ioc工程
二、 代码修改
1、串口初始化函数MX_USART2_UART_Init()
#xff08;1#xff09;MX_USART2_UART_Init()串口参数初始化函数
#xff08;2#xff09;HAL_UART_MspInit()串口功能模块初始化函数
2、串口…目录
一、硬件及工程
1、硬件
2、软件目的
3、创建.ioc工程
二、 代码修改
1、串口初始化函数MX_USART2_UART_Init()
1MX_USART2_UART_Init()串口参数初始化函数
2HAL_UART_MspInit()串口功能模块初始化函数
2、串口中断的执行过程
3、启动串口接收中断
4、自动生成main函数
5、启动串口接收函数HAL_UART_Receive_IT()
6、修改main.c函数
7、从定义回调函数
8、修改while(1)循环
三、下载运行
1、安装串口助手
2、验证串口通讯结果 一、硬件及工程
1、硬件 本文旨在以实例说明STM32单片机通过串口接收数据的实现过程。本文中使用ST的开发板NUCLEO-G474RE板上MCU型号为STM32G474RET6。配套的扩展板为作者根据说明书自己设计制造链接
2、软件目的 实例运行后通过串口通讯助手发送0x10时开发板上的LD2灯亮其它数据灯灭。
3、创建.ioc工程 配置GPIO→配置时钟源和DEBUG→配置外部中断→配置串口→配置串口中断→配置系统时钟→build生成。 将PA4、PA5配置为输出GPIO_OutputPPPull upPC13配置为中断模式GPIO_EXTI13上升沿触发用于检测按键B1的状态PA2、PA3分别配置为串口USART2_TX和USART2_RX外部时钟Debug设置为Serial WireUSART2的基本参数波特率115200数据长度8bit无校验停止位1PA4别名BUZPA5别名LEDPC13别名KEY串口中断抢占优先级1外部中断抢占优先级4
二、 代码修改 硬件配置完毕后启动代码生成IDE自动将配置好的硬件信息转换成代码。 自动生成的代码有些需要了解比如初始化函数而有些是需要修改的比如while(1)循环里需要增加的代码一些注释对里需要增加的代码还有一些需要重写比如重写弱函数。
1、串口初始化函数MX_USART2_UART_Init()
1MX_USART2_UART_Init()串口参数初始化函数 MX_USART2_UART_Init()函数主要完成对USART2的模式和参数配置如波特率、数据位、停止位等。因为串口模块要比GPIO复杂所以配置参数也更多。
/*** brief USART2 Initialization Function* param None* retval None*/
static void MX_USART2_UART_Init(void)
{/* USER CODE BEGIN USART2_Init 0 *//* USER CODE END USART2_Init 0 *//* USER CODE BEGIN USART2_Init 1 *//* USER CODE END USART2_Init 1 */huart2.Instance USART2;huart2.Init.BaudRate 115200;huart2.Init.WordLength UART_WORDLENGTH_8B;huart2.Init.StopBits UART_STOPBITS_1;huart2.Init.Parity UART_PARITY_NONE;huart2.Init.Mode UART_MODE_TX_RX;huart2.Init.HwFlowCtl UART_HWCONTROL_NONE;huart2.Init.OverSampling UART_OVERSAMPLING_16;huart2.Init.OneBitSampling UART_ONE_BIT_SAMPLE_DISABLE;huart2.Init.ClockPrescaler UART_PRESCALER_DIV1;huart2.AdvancedInit.AdvFeatureInit UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(huart2) ! HAL_OK){Error_Handler();}if (HAL_UARTEx_SetTxFifoThreshold(huart2, UART_TXFIFO_THRESHOLD_1_8) ! HAL_OK){Error_Handler();}if (HAL_UARTEx_SetRxFifoThreshold(huart2, UART_RXFIFO_THRESHOLD_1_8) ! HAL_OK){Error_Handler();}if (HAL_UARTEx_DisableFifoMode(huart2) ! HAL_OK){Error_Handler();} MX_USART2_UART_Init()自动生成于main.c中 该函数内部出现的HAL_UART_Init(UART_HandleTypeDef *huart)在stm32g4xx_hal_uart.c中。
2HAL_UART_MspInit()串口功能模块初始化函数 对于串口来说针对引脚等参数的配置是在文件stm32g4xx_hal_msp.c中。msp是MCU support package的缩写指的是MCU相关的支持包。关于串口有3个支持包
HAL_MspInit(void)
HAL_UART_MspInit(UART_HandleTypeDef *huart)
HAL_UART_MspDeInit(UART_HandleTypeDef *huart) 由函数名可见其中都带有MspInit字样。这类函数的作用是进行MCU功能模块譬如串口、定时器、ADC等的初始化。在固件库中通常是采用这种方式将MCU的模块初始化代码集中起来以方便代码在不同型号的MCU上移植。 上述函数中第一个是初始化全局Msp。后面两个函数的参数完全一样函数名也很类似区别是后一个函数名中多了两个字母“De”是Default的缩写。 HAL_UART_MspInit()函数可以对串口硬件初始化、配置引脚模式以及设置中断优先级并使能中断与对GPIO进行初始化的MX_GPIO_Init()函数所完成的功类似。 HAL_UART_MspDeInit()函数可以把串口复位成初始值关闭串口并关闭串口中断。 HAL_UART_MspInit()函数是由函数HAL_UART_Init()在stm32g4xx_hal_uart.c文件中定义调用的。而HAL_UART_Init()是由MX_USART2_UART_Init()函数调用的在if语句的条件表达式中调用。
2、串口中断的执行过程 由于配置了串口的中断功能所以当中断发生后就会调用相应的中断服务函数来完成一定的任务。
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
{... .../*if no error occurs */errorflags (isrflags (uint32_t(USART_ISR_PE|USART_ISR_FE|USART_ISR_ORE|USART_ISR_NE));if(errorflags 0U){/*------UART in mode Receiver-------*/if(((isrflags USART_ISR_RXNE_RXFNE) ! 0U) (((crlits USART_CR1_RXNEIE_RXFNEIE) ! 0U)||((cr3its USART_CR3_RXFTIE) ! 0U))){if(huart-RxISR ! NULL){huart-RxISR(huart);}return;}}
... ...
} 当程序执行到huart →RxISR(huart)时会调用UART_RxISR_8BIT()函数如果配置数据字长为7位或8位则调用此函数如果数据字长为9位则会调用另一函数UART_RxISR_16BIT并且在该函数中会调用回调函数HAL_UART_RxCpltCallback()。这个回调函数是在stm32g4xx_hal_ uart.c中定义的弱函数。用户需要重写该函数可以写在main.c中。
3、启动串口接收中断 在使用中断之前还要用到函数HAL_UART_Receive_IT()。该函数的格式如下
HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size) 该函数是给将要接收的数据定义一个缓冲区pData并指定接收数据的长度为Size也就是要接收的字节数。这个Size决定了调用回调函数的频率。如果Size大于1则不会每次中断都调用回调函数而是到Size次之后才会再调用一次回调函数。此外这个函数还有开启接收中断的功能所以需要在main函数的初始化代码中调用一次HAL_UART_Receive_IT()函数。这样就可以确保开启接收中断。在执行一次回调函数时接收中断会关闭所以还需要再次开启接收中断。这个再次开启中断的动作也可以在回调函数中通过调用HAL_UART_Receive_IT()函数来实现。
4、自动生成main函数 完成上面的硬件配置并自动生成代码后然后在main.c中的初始化部分调用HAL_UART_ Receive _IT()函数设置参数并开启接收中断然后写回调函HAL_UART_RxCpltCallback()以便对接收的数据进行处理。删除了一些注释对。
#include main.h
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 *//* USERCODE END 2 */while(1){}
} main函数中出现了一个串口初始化函数MX_USART2_UART_Init()。此外在main.c中首先定义了一个全局变量huart2类型为UART_HandleTypeDef。huart2是一个结构体变量通常也称为串口句柄。这个结构体是关于UART的它的成员有很多有的成员本身也是结构体类型。这个结构体有些复杂。在串口初始化函数MX_USART2_UART_Init中使用了huart2变量。
static void MX_USART2_UART_Init(void)
{huart2.Instance USART2;huart2.Init.BaudRate 115200;huart2.Init.WordLength UART_WORDLENGTH_8B;huart2.Init.StopBits UART_STOPBITS_1;huart2.Init.Parity UART_PARITY_NONE;huart2.Init.Mode UART_MODE_TX_RX;huart2.Init.HwFlowCtl UART_HWCONTROL_NONE;... ...
} 由此可见在MX_USART2_UART_Init函数中第一句huart2.Instance USART2,就将前面配置的USART2与结构体变量huart2关联了起来。
5、启动串口接收函数HAL_UART_Receive_IT() 要实现串口接收中断需要在主程序的初始化代码中调用HAL_UART_Receive_IT()函数。该函数的结构如下
HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData,uint16_t Size) 该函数有三个参数第一个参数的类型就是UART_HandleTypeDef所以要将该参数与USART2关联起来。因此HAL_UART_Receive_IT()函数的调用要可将该函数放到MX_USART2 _UART_Init()函数之后的注释对中。 HAL_UART_Receive_IT()函数的第二个参数是设置接收数据的缓冲区可以定义一个长度为RXBUFFERSIZE的数组RxBuffer [RXBUFFERSIZE]当然这个数组以及RXBUFFERSIZE都需要另外定义后面会将它们定义为全局变量。 HAL_UART_Receive_IT()函数的第三个参数用于指定接收数据的长度这个数据长度可以与接收缓冲区的长度相同即RXBUFFERSIZE。 将RxBuffer[RXBUFFERSIZE]定义为全局变量需要放到注释对中并将对HAL_UART_ Receive_IT()函数的调用放置到MX_USART2_UART_Init()语句之后的注释对/* USER CODE BEGIN 2 */与/* USER CODE END 2 */中。
6、修改main.c函数
#include main.h
UART_HandleTypeDef huart2;
/* USER CODE BEGIN PV */
/* 直接使用了变量RXBUFFERSIZE */
uint8_t RxBuffer[RXBUFFERSIZE];
/* USER CODE END PV */
/*Private function prototypes */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART2_UART_Init();/* USER CODE BEGIN2 */HAL_UART_Receive_IT(huart2,(uint8_t*)RxBuffer,RXBUFFERSIZE);/* USER CODE END2 */while(1){}
} 上面直接使用了变量RXBUFFERSIZE。对该变量的定义可以放到main.h头文件中可以用define宏也需放置到注释对中
/* USER CODE BEGIN Private defines */
#define RXBUFFERSIZE 1 //接收缓冲区的长度
/* USER CODE END Private defines */ 将RXBUFFERSIZE定义为1也就是1字节。
7、从定义回调函数 重定义串口中断接收的回调函数HAL_UART_RxCpltCallback()。这个函数已经在stm32g4xx_ hal_uart.c中有定义只不过被定义为弱函数实际就是一个空函数。需要重写它。与写EXTI的回调函数类似也将该函数写在main.c中。 串口有数据送来会执行中断服务函数USART2_IRQHandler()然后该函数又会调用函数HAL_UART_IRQHandler()。调用一定次数的HAL_UART_IRQHandler()函数后就会自动执行回调函数HAL_UART_RxCpltCallback()。这里的“一定次数”是由HAL_UART_Receive_IT()函数的第三个参数决定的也就是前面在主程序中用到的常量RXBUFFERSIZE。由于把RXBUFFERSIZE定义为1所以串口收到1字节的数据后会调用一次回调函数HAL_UART_RxCpltCallback()。当调用回调函数之时1字节的数据已经放到了接收缓冲区中也就是放到前面定义的数组RxBuffer中。 调用HAL_UART_Receive_IT()函数不但实现了定义缓冲区并设置接收数据长度的功能而且还有开启串口中断接收的功能。因此在接收完指定长度的数据之后需要重新开启接收中断的功能否则后面就不会再进入中断了。可以在回调函数HAL_UART_RxCpltCallback()中调用一下HAL_UART_Receive_IT()函数重新开启接收中断。对该函数的调用可以连同EXTI的回调函数HAL GPIO_EXTI_Callback()一起写在main.c后面的注释对中
/*USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{HAL_UART_Receive_IT(huart2,(uint8_t *)RxBuffer,RXBUFFERSIZE);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_RESET);HAL_Delay(100); //延时HAL_GPIO_WritePin(BUZ_GPIO_Port,BUZ_Pin,GPIO_PIN_SET);
}
/*USER CODE END 4 */ 在EXTI的回调函数中使用了中断的方式实现当按键按下时让蜂鸣器响一声。
8、修改while(1)循环 根据串口送来的数据控制发光二极管的亮灭。当接收到的数据为0x10十六进制时点亮LD2当接收到的数据不是0x10时熄灭LD2。
/*USER CODE BEGIN WHILE */
while(1)
{/*USER CODE BEGIN 3 */if(RxBuffer[0] 0x10)HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);elseHAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);
}
/*USER CODE END 3 */
三、下载运行
1、安装串口助手 好用的 Win10 串口调试助手 网口调试 - 知乎 https://zhuanlan.zhihu.com/p/109941792?eqida328954a0002e745000000066477efb6utm_id0
2、验证串口通讯结果 开启串口通讯发送0x10开大坂上的LD2亮发送其它内容比如0x20LD2灭。
文章转载自: http://www.morning.lywpd.cn.gov.cn.lywpd.cn http://www.morning.jpbky.cn.gov.cn.jpbky.cn http://www.morning.qrcsb.cn.gov.cn.qrcsb.cn http://www.morning.ssjtr.cn.gov.cn.ssjtr.cn http://www.morning.hzryl.cn.gov.cn.hzryl.cn http://www.morning.weitao0415.cn.gov.cn.weitao0415.cn http://www.morning.snygg.cn.gov.cn.snygg.cn http://www.morning.kfcz.cn.gov.cn.kfcz.cn http://www.morning.yrms.cn.gov.cn.yrms.cn http://www.morning.cczzyy.com.gov.cn.cczzyy.com http://www.morning.wnbpm.cn.gov.cn.wnbpm.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.mdwlg.cn.gov.cn.mdwlg.cn http://www.morning.dkzwx.cn.gov.cn.dkzwx.cn http://www.morning.dpplr.cn.gov.cn.dpplr.cn http://www.morning.jjpk.cn.gov.cn.jjpk.cn http://www.morning.pftjj.cn.gov.cn.pftjj.cn http://www.morning.xsctd.cn.gov.cn.xsctd.cn http://www.morning.sffkm.cn.gov.cn.sffkm.cn http://www.morning.nhzxr.cn.gov.cn.nhzxr.cn http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn http://www.morning.tkzrh.cn.gov.cn.tkzrh.cn http://www.morning.wbfg.cn.gov.cn.wbfg.cn http://www.morning.fjzlh.cn.gov.cn.fjzlh.cn http://www.morning.xbtlt.cn.gov.cn.xbtlt.cn http://www.morning.zdhxm.com.gov.cn.zdhxm.com http://www.morning.ykshx.cn.gov.cn.ykshx.cn http://www.morning.grpbt.cn.gov.cn.grpbt.cn http://www.morning.krklj.cn.gov.cn.krklj.cn http://www.morning.stxg.cn.gov.cn.stxg.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.jjxnp.cn.gov.cn.jjxnp.cn http://www.morning.hypng.cn.gov.cn.hypng.cn http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn http://www.morning.xrftt.cn.gov.cn.xrftt.cn http://www.morning.xsetx.com.gov.cn.xsetx.com http://www.morning.cwqln.cn.gov.cn.cwqln.cn http://www.morning.xmnlc.cn.gov.cn.xmnlc.cn http://www.morning.qrwjb.cn.gov.cn.qrwjb.cn http://www.morning.qnypp.cn.gov.cn.qnypp.cn http://www.morning.lrylj.cn.gov.cn.lrylj.cn http://www.morning.hyxwh.cn.gov.cn.hyxwh.cn http://www.morning.lhsdf.cn.gov.cn.lhsdf.cn http://www.morning.mflhr.cn.gov.cn.mflhr.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.mdjtk.cn.gov.cn.mdjtk.cn http://www.morning.nfks.cn.gov.cn.nfks.cn http://www.morning.zlrsy.cn.gov.cn.zlrsy.cn http://www.morning.yqpzl.cn.gov.cn.yqpzl.cn http://www.morning.fnzbx.cn.gov.cn.fnzbx.cn http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.npmpn.cn.gov.cn.npmpn.cn http://www.morning.xnnxp.cn.gov.cn.xnnxp.cn http://www.morning.bhxzx.cn.gov.cn.bhxzx.cn http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn http://www.morning.smj78.cn.gov.cn.smj78.cn http://www.morning.fjptn.cn.gov.cn.fjptn.cn http://www.morning.tbjtp.cn.gov.cn.tbjtp.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.lthgy.cn.gov.cn.lthgy.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn http://www.morning.mnwmj.cn.gov.cn.mnwmj.cn http://www.morning.gqjqf.cn.gov.cn.gqjqf.cn http://www.morning.pnljy.cn.gov.cn.pnljy.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.qkwxp.cn.gov.cn.qkwxp.cn http://www.morning.csdgt.cn.gov.cn.csdgt.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.bxch.cn.gov.cn.bxch.cn http://www.morning.wwznd.cn.gov.cn.wwznd.cn http://www.morning.qgghr.cn.gov.cn.qgghr.cn http://www.morning.kstlm.cn.gov.cn.kstlm.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.lrylj.cn.gov.cn.lrylj.cn http://www.morning.wnkbf.cn.gov.cn.wnkbf.cn http://www.morning.shxmr.cn.gov.cn.shxmr.cn http://www.morning.pngph.cn.gov.cn.pngph.cn