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/F4
int fputc(int ch, FILE *f)
{
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
USART1->DR = (uint8_t) ch;
return ch;
}
//重定义fputc函数 F7/H7
int 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)
#endif
PUTCHAR_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); //每接收一个数据,就打开一次串口中断接收,否则只会接收一个数据就停止接收
}
}