GPIO操作
GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; //PG12 CLK GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;//推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA,&GPIO_Initure); //PB3,4,7,8,9 GPIO_Initure.Pin=GPIO_PIN_7; HAL_GPIO_Init(GPIOB,&GPIO_Initure);//???
定时
void delay_us(uint16_t us){ uint16_t differ=0xffff-us-5; HAL_TIM_Base_Start(&htim5); __HAL_TIM_SetCounter(&htim5,differ); while(differ < 0xffff-5) { differ = __HAL_TIM_GetCounter(&htim5); } HAL_TIM_Base_Stop(&htim5);}void delay_ms(uint16_t nms){ uint16_t i; for(i=0;i<nms;i++) delay_us(1000);}
串口
1. use microlib
用前提!!!: 勾选use microlib //重定义fputc函数 F1/F4int fputc(int ch, FILE *f){ while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (uint8_t) ch; return ch;}//重定义fputc函数 F7/H7int fputc(int ch, FILE *f){ while((USART3->ISR&0X40)==0);//循环发送,直到发送完毕 USART3->TDR=(uint8_t)ch; return ch;}
2. 不用microlib
#if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f){ while((USART3->ISR&0X40)==0);//循环发送,直到发送完毕 USART3->TDR=ch; return ch;}#endif
3. simple way
#include <stdio.h>#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endifPUTCHAR_PROTOTYPE{ HAL_UART_Transmit(&huart3,(uint8_t*)&ch, 1, 0xFFFF); return ch;}
uint8_t RxBuff[1]; //进入中断接收数据的数组uint8_t DataBuff[100]; //保存接收到的数据的数组int RxLine=0; //接收到的数据长度void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){if(huart->Instance==USART1){ RxLine++; //每接收到一个数据,进入回调数据长度加1 DataBuff[RxLine-1]=RxBuff[0]; //把每次接收到的数据保存到缓存数组 if(RxBuff[0]=='$') //接收结束标志位,这个数据可以自定义,根据实际需求,这里只做示例使用,不一定是0xff { printf("%s \r\n",DataBuff); uint8_t i; for(i=0;i<RxLine;i++){ if(DataBuff[i]== } memset(DataBuff,0,sizeof(DataBuff)); //清空缓存数组 RxLine=0; //清空接收长度 } RxBuff[0]=0; HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一个数据,就打开一次串口中断接收,否则只会接收一个数据就停止接收 }}