代码改变世界

usart串口用法。

2013-07-16 15:38  楼下的房东  阅读(828)  评论(0)    收藏  举报

串口初始化,时钟初始化,对应IO口初始化。看IO口是读是写。

PA10 USART1_RX 浮空输入或上拉    

PA9 USART1_TX 推挽复用

"

一、GPIO配置
(1)GPIO_Mode_AIN 模拟输入 
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入 
(4)GPIO_Mode_IPU 上拉输入 
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出 
(8)GPIO_Mode_AF_PP 复用推挽输出
GPIO_Speed_10MHz 最高输出速率10MHz 
GPIO_Speed_2MHz 最高输出速率2MHz 
GPIO_Speed_50MHz 最高输出速率50MHz

1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信 号的速度与程序有关(芯片内部在I/O口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较 高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

 

没有中断的方法。

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h" 
void GPIO_Initialization()                      
{
    GPIO_InitTypeDef GPIO_InitStructure;  //从GPIO_InitTypeDef 开始找,还要加上GPIO_Init
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
}


void RCC_Initialization()

{

       SystemInit();

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE ); //或标志,启动了GPIO B和E的 时钟。控制GPIO口
                                                                                   //先要初始化GPIO口和RCC(时钟)

}

void USART_Initialization()
{
    USART_InitTypeDef USART_InitStructure;

    USART_InitStructure.USART_BaudRate=9600;
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_Parity=USART_Parity_No;
    USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;    
    USART_Init(USART1, &USART_InitStructure);
    
    USART_Cmd(USART1, ENABLE);    
}

void USART_Reset()
{
    USART_DeInit(USART1);
}

void Delay(vu32 n)
{
    for(;n!=0;n--);
}


int main()
{        

    RCC_Initialization();
    USART_Reset();
    GPIO_Initialization();
    USART_Initialization();
    while(1)
        {
            u8 res;
            res=USART_ReceiveData(USART1);
            USART_SendData(USART1,res);
            Delay(50);    
        }
}

问题

不停读空字节。
 
尝试加入中断
R暂时一直为0.
 
带中断
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"

/*#define USART_REC_LEN 200
extern u8  USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
extern u16 USART_RX_STA;
u8 USART_RX_BUF[USART_REC_LEN];
u16 USART_RX_STA=0;      */

void delay(vu32 n)
{
    for(;n!=0;n--);
}



void USART_Initialization()
{
      GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE );      //1.串口,GPIO时钟使能
    USART_DeInit(USART1);                                                              //2.串口复位

                                                                                        //3.GPIO模式设置
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA,&GPIO_InitStructure);

                                                                                          //4.串口模式设置
    USART_InitStructure.USART_BaudRate=9600;
    USART_InitStructure.USART_WordLength=USART_WordLength_8b;
    USART_InitStructure.USART_StopBits=USART_StopBits_1;
    USART_InitStructure.USART_Parity=USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;        
    USART_Init(USART1, &USART_InitStructure);

          //如果使能了接收  
                                                                                          //5.Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                       //6.开启中断


       USART_Cmd(USART1, ENABLE);                                                              //7.使能串口
}

void USART1_IRQHandler(void)
{
    u16 i;
    /*处理接收到的数据*/
    if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
    {              
        i = USART_ReceiveData(USART1);
        USART_SendData(USART1,i);
        delay(500);
       while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {
        }             
    }
}


      


int main(void)
{
    USART_Initialization();
    while(1)
    {    
    }
}


有一行会出现多个输入的问题。但总体来说中断是成功了。把原来在main中语句换到了中断里。