完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
开发板:普中A7核心板子
板:STM32F103C8T6 HAL库版本:STM32Cube_FW_F1_V1.8.0注意事项: 1,在HAL_UART_MspInit()函数中不能使用HAL_UART_Receive_IT()或HAL_UART_Transmit_IT()函数中说,否则会中断设置; 2,在HAL_UART_RxCpltCallback(这个家庭函数中不能使用HAL_UART_Transmit_IT()进行发送数据,要不发送出去的就是乱码'?'符号; 3、在HAL_UART_Transmit(&UART_Struct,recv_buf,50,1000)这个函数中参数50会导致输出编码编码后卡死;唯一设置为HAL_UART_Transmit(&UART_Struct,recv_buf,1,1000)参数为1; 4、在HAL_UART_TransmitRxCpltCallback()函数中使用HAL_UART_Transmit()来发送数据,串口调试助手发送数据到目标点快一点会死卡,而直接使用写字就不会死在printf重定位中的fputc()函数中使用HAL_UART_Transmit()来发送数据,并在main()的话主函数中的while(1)死循环里面只用printf()函数打印数据就不会出现卡死的情况; 5、不能出现卡死的情况在USART1_IRQHandler()中断处理函数中使用HAL_UART_Receive()和HAL_UART_Transmit()函数,这两种方式容易导致程序卡死 /***************************************************** **** ************************************************ * 功能功能:主主功能 * 参数: * 返回值: * 注意事项: ****************************************************** **** ********************************************/ int main(void) { 无符号字符 i, j = 0; HAL_Init(); SystemClock_Config(); UART_Init(); Led_Init(); printf("这是测试函数rn"); 而 (1) { printf("你好世界 %drn", j++); // for(i=0; i<8; i++) // { // LED_ON(i); // HAL_Delay(500); // LED_OFF(i); // } } } /** * @brief 系统配置 *系统配置如下: * 系统时钟源 = PLL (HSI) * SYSCLK(Hz) = 72000000 * HCLK(Hz) = 72000000 * AHB 预分频器 = 1 * APB1 预分频器 = 2 * APB2 预分频器 = 1 * PLLMUL = 9 * 延迟(WS) = 2 * @param 无 * @retval 无 */ void SystemClock_Config(void) { RCC_ClkInitTypeDef clkinitstruct = {0}; RCC_OscInitTypeDef oscinitstruct = {0}; /* 配置锁相环-------------------------------------------- ----------*/ /* PLL 配置:PLLCLK = HSE * PLLMUL = 8 * 9 = 72 MHz */ /* PREDIV1 配置:PREDIV1CLK = PLLCLK / HSEPredivValue = 64 / 1 = 64 MHz */ /* 启用 HSI 并以 HSi_DIV2 作为源激活 PLL */ oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; oscinitstruct.HSEState = RCC_HSE_ON; oscinitstruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; oscinitstruct.PLL.PLLState = RCC_PLL_ON; oscinitstruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; oscinitstruct.PLL.PLLMUL = RCC_PLL_MUL9; 如果 (HAL_RCC_OscConfig(&oscinitstruct)!= HAL_OK) { /* 初始化错误 */ 同时(1); } /* 选择PLL作为系统时钟源并配置HCLK、PCLK1和PCLK2 钟分频器*/ clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1; clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1; clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2; 如果 (HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2)!= HAL_OK) { /* 初始化错误 */ 同时(1); } } /***************************************************** **** ************************************************ * 功能功能:LED初始化程序,初始化之后关闭所以LED灯 * 参数: * 返回值: * 注意事项: ****************************************************** **** ********************************************/ void Led_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); LED_ALL_OFF(); 返回; } UART_HandleTypeDef UART_Struct; uint8_t recv_buf[1] = {0}; /* 接收 */ /***************************************************** **** ************************************************ * 函数功能:UART初始化函数 * 参数: * 返回值: *注意事项:HAL_UART_Receive_IT()要在HAL_UART_Init()之后调用 ****************************************************** **** ********************************************/ void UART_Init(void) { UART_Struct.Instance = USART1; UART_Struct.Init.HwFlowCtl = UART_HWCONTROL_NONE; UART_Struct.Init.WordLength = UART_WORDLENGTH_8B; UART_Struct.Init.BaudRate = 115200; UART_Struct.Init.Mode = UART_MODE_TX_RX; UART_Struct.Init.Parity = UART_PARITY_NONE; UART_Struct.Init.StopBits = UART_STOPBITS_1; HAL_UART_Init(&UART_Struct); // __HAL_UART_ENABLE_IT(&UART_Struct, UART_IT_RXNE); /* 跟野火的代码学的 */ HAL_UART_Receive_IT(&UART_Struct, recv_buf, 1); 返回; } /***************************************************** **** ************************************************ * 函数功能:HAL_UART_Init中的调用函数 * 参数: * 返回值: * 注意事项:HAL_UART_Receive_IT()不能在HAL_UART_MspInit()中调用 ****************************************************** **** ********************************************/ void HAL_UART_MspInit(UART_HandleTypeDef *huart) { GPIO_InitTypeDef GPIO_InitStuct; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_USART1_CLK_ENABLE(); // __HAL_RCC_AFIO_CLK_ENABLE(); /*怀疑不用开,在正点原子代码中开启,野火代码中未开*/ GPIO_InitStuct.Mode = GPIO_MODE_AF_PP; GPIO_InitStuct.Pin = GPIO_PIN_9; GPIO_InitStuct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStuct); GPIO_InitStuct.Mode = GPIO_MODE_AF_INPUT; GPIO_InitStuct.Pin = GPIO_PIN_10; GPIO_InitStuct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStuct); HAL_NVIC_EnableIRQ(USART1_IRQn); 返回; } /***************************************************** **** ************************************************ * 函数功能:HAL_UART_IRQHandler中的行为函数 * 参数: * 返回值: *注意事项:使用HAL_UART_Transmit()来发送数据,串口调试助手发送数据到点快一点的话 *会卡死,而使用直接写词就不会卡死; ****************************************************** **** ********************************************/ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { WRITE_REG(UART_Struct.Instance->DR, recv_buf[0]); // HAL_UART_Transmit(&UART_Struct,recv_buf,1,1000); // while(__HAL_UART_GET_FLAG(&UART_Struct, UART_FLAG_TC) != SET); HAL_UART_Receive_IT(&UART_Struct, recv_buf, 1); 返回; } /***************************************************** **** ************************************************ * 函数功能:为了移植printf函数 * 参数: * 返回值: * 注意事项: ****************************************************** **** ********************************************/ int fputc(int ch, FILE * f) { HAL_UART_Transmit(&UART_Struct, (uint8_t*)&ch, 1, 1000); 返回0; } /***************************************************** **** ************************************************ * 功能:USART1_IRQHandler中断处理函数 * 参数: * 返回值: *注意事项:不能使用HAL_UART_Receive()和HAL_UART_Transmit()函数,因为这两个是转发式的 *容易造成程序卡死 ****************************************************** **** ********************************************/ 输入 USART1_IRQHandler(输入) { HAL_UART_IRQHandler(&UART_Struct); #如果0 uint16_t ch = 0; // uint8_t ch = 0; if(__HAL_UART_GET_FLAG(&UART_Struct, UART_FLAG_RXNE) != RESET) { /* 使用HAL库函数接收和发送字符容易程序卡死 */ // HAL_UART_Receive(&UART_Struct, &ch, 1, 1000); // HAL_UART_Transmit(&UART_Struct, &ch, 1, 1000); ch = (uint16_t)READ_REG(UART_Struct.Instance->DR); WRITE_REG(UART_Struct.Instance->DR, ch); } #万一 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1935浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
728浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
567浏览 3评论
593浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
551浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 09:17 , Processed in 1.059686 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号