请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

B-U585I-IOT02A开发板之自用程序模板

胤幻1988 发布时间:2021-10-12 15:37
当年学STM32从正点原子入得坑,很习惯它的那套程序架构及几个核心文件~这了我已官方的例程为样板稍微修改下~
作为B-U585I-IOT02A开发板之自用程序模板~
主要开启了SYSTICK 作为延时函数基准,具有毫秒微妙级别延时函数,USART1作为调试串口,快速printf及接受数据~
并调了一个LED~主循环代码为查询串口,并输出输入的字~
结构:
DM1.png
sys包含数据类型的简化定义定义及一些汇编指令~
delay包含us及ms级别延时及延时初始化~
usart_debug包含串口printf重定向及串口接受中断函数,数据接收均以“\r\n”为结束标志~
串口初始化:
  1. void MX_USART1_UART_Init(void)
  2. {

  3.   /* USER CODE BEGIN USART1_Init 0 */

  4.   /* USER CODE END USART1_Init 0 */

  5.   /* USER CODE BEGIN USART1_Init 1 */

  6.   /* USER CODE END USART1_Init 1 */
  7.   huart1.Instance = USART1;
  8.   huart1.Init.BaudRate = 115200;
  9.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  10.   huart1.Init.StopBits = UART_STOPBITS_1;
  11.   huart1.Init.Parity = UART_PARITY_NONE;
  12.   huart1.Init.Mode = UART_MODE_TX_RX;
  13.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  14.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  15.   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  16.   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  17.   huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  18.   if (HAL_UART_Init(&huart1) != HAL_OK)
  19.   {
  20.     Error_Handler();
  21.   }
  22.   if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }
  26.   if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN USART1_Init 2 */
  35. #if EN_USART1_RX
  36.   HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
  37. #endif
  38.   /* USER CODE END USART1_Init 2 */

  39. }
复制代码


串口中断会掉函数:
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {

  3.         if(huart->Instance==USART1)//如果是串口1
  4.         {
  5.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  6.                 {
  7.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  8.                         {
  9.                                 if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  10.                                 else USART_RX_STA|=0x8000;        //接收完成了
  11.                         }
  12.                         else //还没收到0X0D
  13.                         {        
  14.                                 if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
  15.                                 else
  16.                                 {
  17.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
  18.                                         USART_RX_STA++;
  19.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收         
  20.                                 }                 
  21.                         }
  22.                 }

  23.     HAL_UART_Receive_IT(huart,(u8 *)aRxBuffer, RXBUFFERSIZE);
  24.         }
  25. }
复制代码
delay函数:
  1. void delay_us(u32 nus)
  2. {               
  3.         u32 ticks;
  4.         u32 told,tnow,tcnt=0;
  5.         u32 reload=SysTick->LOAD;                                //LOAD的值                     
  6.         ticks=nus*fac_us;                                                 //需要的节拍数
  7.         told=SysTick->VAL;                                        //刚进入时的计数器值
  8.         while(1)
  9.         {
  10.                 tnow=SysTick->VAL;        
  11.                 if(tnow!=told)
  12.                 {            
  13.                         if(tnow<told)tcnt+=told-tnow;        //这里注意一下SYSTICK是一个递减的计数器就可以了.
  14.                         else tcnt+=reload-tnow+told;            
  15.                         told=tnow;
  16.                         if(tcnt>=ticks)break;                        //时间超过/等于要延迟的时间,则退出.
  17.                 }  
  18.         };
  19. }

  20. //延时nms
  21. //nms:要延时的ms数
  22. void delay_ms(u16 nms)
  23. {
  24.         u32 i;
  25.         for(i=0;i<nms;i++) delay_us(1000);
  26. }
复制代码
main,c
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.   u8 len;        
  5.   u16 times=0;
  6.   /* USER CODE END 1 */

  7.   /* MCU Configuration--------------------------------------------------------*/

  8.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9.   HAL_Init();

  10.   /* USER CODE BEGIN Init */

  11.   /* USER CODE END Init */

  12.   /* Configure the system clock */
  13.   SystemClock_Config();

  14.   /* USER CODE BEGIN SysInit */

  15.   /* USER CODE END SysInit */

  16.   /* Initialize all configured peripherals */
  17.   MX_GPIO_Init();
  18.   MX_USART1_UART_Init();
  19.   MX_SPI2_Init();
  20.   /* USER CODE BEGIN 2 */
  21.   
  22.   //uartdbg_init(115200);
  23.   delay_init(168);                       //初始化延时函数
  24.   uartdbg_init(115200);
  25.   LED_Init();                                                //初始化LED        
  26.   /* USER CODE END 2 */

  27.   /* Infinite loop */
  28.   /* USER CODE BEGIN WHILE */
  29.   while (1)
  30.   {

  31.     if(USART_RX_STA&0x8000)
  32.                 {                                          
  33.                         len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  34.                         printf("\r\n您发送的消息为:\r\n");
  35.                         HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);        //发送接收到的数据
  36.                         while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);                //等待发送结束
  37.                         printf("\r\n\r\n");//插入换行
  38.                         USART_RX_STA=0;
  39.                 }else
  40.                 {
  41.                         times++;
  42.                         if(times%5000==0)
  43.                         {
  44.                                 printf("\r\nSTM32F417_COREBOARD 串口实验\r\n");
  45.                                 printf("胤幻1988@ST中文论坛\r\n\r\n\r\n");
  46.                         }
  47.                         if(times%200==0){printf("请输入数据,以回车键结束\r\n"); }
  48.                         if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.
  49.                         delay_ms(10);   
  50.                 }
  51.     /* USER CODE END WHILE */

  52.     /* USER CODE BEGIN 3 */
  53.   }
  54.   /* USER CODE END 3 */
  55. }
复制代码
下载后,串口响应:
ZM1.png
好了,模板就到这了~
代码: STM32U585AI_DEMO.rar (14.94 MB, 下载次数: 0)
收藏 评论0 发布时间:2021-10-12 15:37

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版