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

基于STM32 代码块经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:30
HAL
溢出中断

PeriodElapsedCallback
  1. **一般用来点亮运行状态指示灯**
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.   if(htim == &htim7)
  5.   {
  6.     static uint16_t cnt;
  7.     cnt++;
  8.     if(cnt>999)
  9.     {
  10.       cnt = 0;
  11.       HAL_GPIO_TogglePin(D2_GPIO_Port,D2_Pin);   
  12.     }
  13.   }
  14. }

复制代码

按键

按键–支持一次、多次
  1. **自行布置位置**
  2. #define KEY0_PRES 0
  3. #define KEY1_PRES 1

  4. #define K0 HAL_GPIO_ReadPin(K0_GPIO_Port,K0_Pin)
  5. #define K1 HAL_GPIO_ReadPin(K1_GPIO_Port,K1_Pin)

  6. uint8_t KEY_Scan(uint8_t mode)//0-断按  1-长按
  7. {
  8.     static uint8_t key_up=1;     //按键松开标志
  9.     if(mode==1)key_up=1;    //支持连按
  10.     if(key_up&&(K0==0||K1==0))
  11.     {
  12.         HAL_Delay(10);
  13.         key_up=0;
  14.         if(K0==0)       return KEY0_PRES;
  15.         else if(K1==0)  return KEY1_PRES;      
  16.     }else if(K0==1&&K1==1)key_up=1;
  17.     return 99;   //无按键按下
  18. }

  19. void Key_Proc()
  20. {
  21.   static uint8_t val;
  22.   val = KEY_Scan(0);
  23.   if(val == 0){
  24.   printf("K0\r\n");
  25.   }else if(val == 1){
  26.   printf("K1\r\n");
  27.   }
  28. }
复制代码

HAL串口
串口
  1. main:
  2. 需要:include "string.h"
  3. if(Fu)
  4. {   
  5.    printf("%s",(char*)Rb);
  6.    memset(Rb,0,sizeof(Rb));
  7.    Fu=0;
  8.    Rc=0;
  9. }

  10. IRQ:
  11. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  12. {
  13.   if(huart==&huart1)
  14.   {
  15.     Rb[Rc] = Tp[0];
  16.     Rc++;
  17.     if(0x0a == Tp[0])
  18.     {
  19.       Fu = 1;
  20.     }
  21.     HAL_UART_Receive_IT(&huart1,(uint8_t *)Tp, Tl);
  22.   }   
  23. }     


  24. .h
  25. #define Rl                          1024          //定义最大接收字节数 200
  26. #define Tl          1
  27. extern uint8_t  Rb[Rl],Rc;      
  28. extern _Bool Fu;                         //接收状态标记       
  29. extern uint8_t Tp[Tl];         

  30. .c
  31. uint8_t  Rb[Rl] = {0},Rc=0;         //数据地址;最大容量
  32. _Bool Fu=0;                         //接收状态标记;实际容量
  33. uint8_t Tp[Tl] = {0};           //接收缓存数组
  34. 下面这句放在.c中串口的初始化函数void MX_USARTx_UART_Init(void)的用户编写区域里面:
  35. HAL_UART_Receive_IT(&huart1, (uint8_t *)Tp, Tl);
复制代码

HAL重定向
不使用micro-Lib
  1. 需要:#include "stdio.h"

  2. #if 1
  3. #pragma import(__use_no_semihosting)            
  4. //标准库需要的支持函数                 
  5. struct __FILE
  6. {
  7.         int handle;
  8. };

  9. FILE __stdout;      
  10. //定义_sys_exit()以避免使用半主机模式   
  11. void _sys_exit(int x)
  12. {
  13.         x = x;
  14. }
  15. #endif
复制代码

HAL 串口1重定向
  1. #ifdef __GNUC__
  2. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  3. #else
  4. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  5. #endif
  6. PUTCHAR_PROTOTYPE
  7. {
  8.         HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号

  9.         return ch;
  10. }
复制代码

标准库串口
串口
  1. main:
  2. 需要:include "string.h"
  3. if(fu)
  4. {
  5.   fu = 0;
  6.   //处理过程
  7.   Rc= 0;
  8.   memset(Rb,0,sizeof(Rb));
  9. }

  10. .c
  11. char Rb[256] = {0};
  12. u8 Rc = 0;
  13. _Bool fu;

  14. .h
  15. extern char Rb[256];
  16. extern u8 Rc;
  17. extern _Bool fu;  
  18.   
  19. IRQ:
  20. void USART1_IRQHandler(void)                        //串口1中断服务程序
  21. {
  22.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  23.         {
  24.       u8 Res;
  25.       Res = USART_ReceiveData(USART1);        //读取接收到的数据
  26.           Rb[Rc] = USART_ReceiveData(USART1);
  27.           if(Res==0x0a)//帧尾
  28.         {
  29.           fu = 1;
  30.         }
  31.         Rc++;
  32.      }
  33. }
  34.      
复制代码

Common
字符串判断

字符串判断
  1. if(strstr(Rb,""Flag":1"))//判断是否存在子字符串“Flag“:1
  2. else if(strstr(Rb,""Flag":0"))//判断是否存在子字符串“Flag”:0
  3.                                 //内部双引号需要转义
复制代码

标准库重定向
  1. #ifdef __GNUC__
  2.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  3.      set to 'Yes') calls __io_putchar() */
  4.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  5. #else
  6.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  7. #endif /* __GNUC__ */
  8.   
  9. PUTCHAR_PROTOTYPE
  10. {
  11.   /* Place your implementation of fputc here */
  12.   /* e.g. write a character to the USART */
  13.   USART_SendData(USART2, (uint8_t) ch);

  14.   /* Loop until the end of transmission */
  15.   while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
  16.   {}

  17.   return ch;
  18. }
复制代码

————————————————
版权声明:动态比特
如有侵权请联系删除


收藏 评论0 发布时间:2023-5-10 18:30

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版