当年学STM32从正点原子入得坑,很习惯它的那套程序架构及几个核心文件~这了我已官方的例程为样板稍微修改下~
作为B-U585I-IOT02A开发板之自用程序模板~
主要开启了SYSTICK 作为延时函数基准,具有毫秒微妙级别延时函数,USART1作为调试串口,快速printf及接受数据~
并调了一个LED~主循环代码为查询串口,并输出输入的字~
结构:
sys包含数据类型的简化定义定义及一些汇编指令~
delay包含us及ms级别延时及延时初始化~
usart_debug包含串口printf重定向及串口接受中断函数,数据接收均以“\r\n”为结束标志~
串口初始化:
- void MX_USART1_UART_Init(void)
- {
- /* USER CODE BEGIN USART1_Init 0 */
- /* USER CODE END USART1_Init 0 */
- /* USER CODE BEGIN USART1_Init 1 */
- /* USER CODE END USART1_Init 1 */
- huart1.Instance = USART1;
- huart1.Init.BaudRate = 115200;
- huart1.Init.WordLength = UART_WORDLENGTH_8B;
- huart1.Init.StopBits = UART_STOPBITS_1;
- huart1.Init.Parity = UART_PARITY_NONE;
- huart1.Init.Mode = UART_MODE_TX_RX;
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;
- huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
- huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
- if (HAL_UART_Init(&huart1) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
- {
- Error_Handler();
- }
- if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN USART1_Init 2 */
- #if EN_USART1_RX
- HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
- #endif
- /* USER CODE END USART1_Init 2 */
- }
复制代码
串口中断会掉函数:
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
- {
- if(huart->Instance==USART1)//如果是串口1
- {
- if((USART_RX_STA&0x8000)==0)//接收未完成
- {
- if(USART_RX_STA&0x4000)//接收到了0x0d
- {
- if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
- else USART_RX_STA|=0x8000; //接收完成了
- }
- else //还没收到0X0D
- {
- if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
- else
- {
- USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
- USART_RX_STA++;
- if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
- }
- }
- }
- HAL_UART_Receive_IT(huart,(u8 *)aRxBuffer, RXBUFFERSIZE);
- }
- }
复制代码 delay函数:
- void delay_us(u32 nus)
- {
- u32 ticks;
- u32 told,tnow,tcnt=0;
- u32 reload=SysTick->LOAD; //LOAD的值
- ticks=nus*fac_us; //需要的节拍数
- told=SysTick->VAL; //刚进入时的计数器值
- while(1)
- {
- tnow=SysTick->VAL;
- if(tnow!=told)
- {
- if(tnow<told)tcnt+=told-tnow; //这里注意一下SYSTICK是一个递减的计数器就可以了.
- else tcnt+=reload-tnow+told;
- told=tnow;
- if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
- }
- };
- }
-
- //延时nms
- //nms:要延时的ms数
- void delay_ms(u16 nms)
- {
- u32 i;
- for(i=0;i<nms;i++) delay_us(1000);
- }
复制代码 main,c
- int main(void)
- {
- /* USER CODE BEGIN 1 */
- u8 len;
- u16 times=0;
- /* USER CODE END 1 */
- /* MCU Configuration--------------------------------------------------------*/
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
- HAL_Init();
- /* USER CODE BEGIN Init */
- /* USER CODE END Init */
- /* Configure the system clock */
- SystemClock_Config();
- /* USER CODE BEGIN SysInit */
- /* USER CODE END SysInit */
- /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART1_UART_Init();
- MX_SPI2_Init();
- /* USER CODE BEGIN 2 */
-
- //uartdbg_init(115200);
- delay_init(168); //初始化延时函数
- uartdbg_init(115200);
- LED_Init(); //初始化LED
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- if(USART_RX_STA&0x8000)
- {
- len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
- printf("\r\n您发送的消息为:\r\n");
- HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000); //发送接收到的数据
- while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
- printf("\r\n\r\n");//插入换行
- USART_RX_STA=0;
- }else
- {
- times++;
- if(times%5000==0)
- {
- printf("\r\nSTM32F417_COREBOARD 串口实验\r\n");
- printf("胤幻1988@ST中文论坛\r\n\r\n\r\n");
- }
- if(times%200==0){printf("请输入数据,以回车键结束\r\n"); }
- if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
- delay_ms(10);
- }
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
- }
- /* USER CODE END 3 */
- }
复制代码 下载后,串口响应:
好了,模板就到这了~
代码:
STM32U585AI_DEMO.rar
(14.94 MB, 下载次数: 5)
|