这是我的第一篇博客,也是我寒假回老家写的第一个程序,由于没有网络只能先打草稿了,还有二十多天就要开学了,抓紧时间准备蓝桥杯!
这次串口实验想要实现的效果是电脑向单片机发送一段信息,单片机收到后返回给电脑。
串口想必是STM32最重要的外设之一吧,usart.c里面主要分为以下几个步骤进行:
1:配置时钟;
2:配置GPIO;
3:配置USART;
4:USART使能以及串口中断使能;
5:配置中断;
6:中断函数;
以下是主要过程:
#include "usart.h"
void MY_USART_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
USART_InitTypeDefUSART_InitStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
u16data;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
data=USART_ReceiveData(USART1);
USART_SendData(USART1,data);
}
*************************************************
加入了新的功能:直接向电脑发送字符串。
加入此函数可实现:
void USART_SendString(char *str)
{
u8index=0;
do
{
USART_SendData(USART1,str[index]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);(容易遗漏!!)
index++;
}
while(str[index]!=0);
}
这里要特别注意的是:
1:voidUSART_SendString(char *str)必须是char型变量,不能用u8来定义,否则会出现黄色感叹号标记。
2:index必须赋初值0,否则字符串前会出现乱码。
在VC6中我们常用到printf函数,非常方便,这里我们对程序加入一些函数,也可以实现这种效果。
首先在usart.h中加入#include “stdio.h”,然后在usart.c中加入
int fputc(int ch, FILE *f)
{
USART_ClearFlag(USART1,USART_FLAG_TC);(必须加上这句!!否则会出现第一句首字母丢失问题!!如果不加,写字符串的时候,前面留一个空格也行)
USART_SendData(USART1,ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
return(ch);
}
最后在魔术棒->target中勾选use Micro LIB。
以上三步,缺一不可!!!!!!!!!!!!!!!!
使用这种重定向,代价是造成代码量急剧上升,请读者权衡。