当前位置:   article > 正文

STM32 代码块总结_stm32代码

stm32代码

F103C8T6 Template

附上f103c8t6模板(正点原子风格):点击下载
在这里插入图片描述
附上一些常用的代码块

HAL

溢出中断

PeriodElapsedCallback

**一般用来点亮运行状态指示灯**
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim == &htim7)
  {
    static uint16_t cnt;
    cnt++;
    if(cnt>999)
    {
      cnt = 0;
      HAL_GPIO_TogglePin(D2_GPIO_Port,D2_Pin);    
    }
  }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

按键

按键–支持一次、多次

**自行布置位置**
#define KEY0_PRES 0
#define KEY1_PRES 1

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

uint8_t KEY_Scan(uint8_t mode)//0-断按  1-长按
{
    static uint8_t key_up=1;     //按键松开标志
    if(mode==1)key_up=1;    //支持连按
    if(key_up&&(K0==0||K1==0))
    {
        HAL_Delay(10);
        key_up=0;
        if(K0==0)       return KEY0_PRES;
        else if(K1==0)  return KEY1_PRES;       
    }else if(K0==1&&K1==1)key_up=1;
    return 99;   //无按键按下
}

void Key_Proc()
{
  static uint8_t val;
  val = KEY_Scan(0);
  if(val == 0){
  printf("K0\r\n");
  }else if(val == 1){
  printf("K1\r\n");
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

HAL串口

串口

main:
需要:include "string.h"
if(Fu)
 {    
   printf("%s",(char*)Rb);
   memset(Rb,0,sizeof(Rb));
   Fu=0;
   Rc=0;
}

IRQ:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  if(huart==&huart1)
  {
    Rb[Rc] = Tp[0];
    Rc++;
    if(0x0a == Tp[0])
    {
      Fu = 1;
    }
    HAL_UART_Receive_IT(&huart1,(uint8_t *)Tp, Tl);
  }   
}     


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

.c
uint8_t  Rb[Rl] = {0},Rc=0;         //数据地址;最大容量
_Bool Fu=0;         		//接收状态标记;实际容量
uint8_t Tp[Tl] = {0};           //接收缓存数组
下面这句放在.c中串口的初始化函数void MX_USARTx_UART_Init(void)的用户编写区域里面:
HAL_UART_Receive_IT(&huart1, (uint8_t *)Tp, Tl);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

HAL重定向

不使用micro-Lib

需要:#include "stdio.h"

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
#endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

HAL 串口1重定向

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

标准库串口

串口

main:
需要:include "string.h"
if(fu)
{
  fu = 0;
  //处理过程
  Rc= 0;
  memset(Rb,0,sizeof(Rb));
}

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

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

Common

字符串判断

字符串判断

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

标准库重定向

#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
  
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART2, (uint8_t) ch);

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

  return ch;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/778190
推荐阅读
相关标签
  

闽ICP备14008679号