所使用板子:野火指南者
配置系统时钟、调试方式之后,对connect下的usart1进行asynchronous(异步)激活,记得激活NVIC。记住此时GPIO初始化无法将USART1_RX的Pin10的普通输入模式改为复用输入。要在后续生成的.c文件中修改(usart的RX、TX是对GPIO相应Pin口的复用)。
打开keil后,先从别的地方找到对应芯片初始化文件,并添加。
编译之后即可使用函数跳转
进入usart.c的usart结构体初始化中添加串口中断使能语句,选择产生中断的事件。
huart1为串口外设的句柄。
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
在usart.c末尾添加printf和scanf的重定向函数。
在首部添加c语言标准库函数stdio.h才可使用printf和scanf。
//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
//重定向c库函数scanf到串口DEBUG_USART,重定向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
因为是要将单片机与电脑上位机进行通信,所以要配置中断,将上位机发送的数据原封不动的送回去(中断服务函数名要在刚开始添加的startup_stm32f1xx.s文件中寻找)
void USART1_IRQHandler(void)
{
uint8_t cu;
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
{
cu = READ_REG(huart1.Instance->DR);
WRITE_REG(huart1.Instance->DR,cu);
}
}
其中所使用的READ_REG与WRITE_REG在stm32f1xx.h中存在,是分别是读取寄存器和向寄存器写入的功能。
到此时,主函数main.c中就可以使用printf函数进行字符输出给上位机
printf("请输入下列字符控制LED\n");
或者在串口调试助手的发送栏发送数据,串口接收后会在接收栏显示。
可以使用如下两个函数实现printf相同的功能
uint8_t a[]={"你好"};
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 4, 500);
/***************** 发送字符串 **********************/
void Usart_SendString(uint8_t *str)
{
unsigned int k=0;
do
{
HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);
k++;
} while(*(str + k)!='\0');
}
HAL_UART_Transmit函数为usart.h头文件中的发送函数。 不那么好用...........
后期可以使用getchar获得电脑上位机发送的字符,用以控制片上外设运行,记得字符的辨别要使用 ‘ ’ ,eg:
if(a == '2')
{
。。。。。。
}
一切只是刚刚开始......