备战蓝桥杯之嵌入式——USART

这是我的第一篇博客,也是我寒假回老家写的第一个程序,由于没有网络只能先打草稿了,还有二十多天就要开学了,抓紧时间准备蓝桥杯!

这次串口实验想要实现的效果是电脑向单片机发送一段信息,单片机收到后返回给电脑。

串口想必是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。

以上三步,缺一不可!!!!!!!!!!!!!!!!

使用这种重定向,代价是造成代码量急剧上升,请读者权衡。

 

 

你可能感兴趣的:(嵌入式)