stm32f10x USART的配置 以开始符和结束符发送命令(一)

#include "usart.h"

#include <string.h>

#include "gpio.h"

#include "stm32f10x.h"

void GPIO_USART_init()
{
    //定义GPIO结构体变量
    GPIO_InitTypeDef GPIO_InitStructure;
    //1,开启时钟 GPIOA|USART1|AFIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
    USART_DeInit(USART1);

    //2,初始化 GPIO
    //PA9 推挽服用
    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);
    //PA10 浮空输入模式(不用上拉也不用下拉 选择浮空)
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_IN_FLOATING;
    //输入 不需要初始化速度
    //GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

}

void usart_init(int BaudRate)
{
    //定义USART,NICV结构变量
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef     NVIC_InitStructure;
    //USART GPIO 的初始化
    GPIO_USART_init();

    //3,初始化USART
    USART_InitStructure.USART_BaudRate                 = BaudRate;                                             /*设置波特率为115200*/
    USART_InitStructure.USART_WordLength             = USART_WordLength_8b;                                      /*设置数据位为8位*/
    USART_InitStructure.USART_StopBits                 = USART_StopBits_1;                                       /*设置停止位为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);

    //4,初始化NVIC
    NVIC_InitStructure.NVIC_IRQChannel                 = USART1_IRQn;                                                        //中断通道号(宏在在头文件stm32F10X.H中以IRQn结尾的)
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;                   //抢占优先级2
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                              //子优先级2
    NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;                    //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);              //根据指定的参数初始化VIC寄存器

    //5,初始化状态
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                                                            //开启中断请求使能
    USART_Cmd(USART1, ENABLE);                                                                                                                    //开启USART1
}
void USART1_IRQHandler()     //串口1中断服务程序
{
    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == 1)
    {

        USART_ENBEN();
        usart_option();
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    }
}

void NVIC_Configuration(void)
{

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

}
//每次进入中断 接收一个字节数据,而不是接收一串字符
//要想接收一串字符(一个一个字符接收,接收结束标志位‘!’)
u8 USART_Rx_buf[32]= {0};    //外部使用
u8 USART_Rx_flag=0;                //接收完成标记位
static u8 count =0, flag_h =0; //count 用于计数  flag_h 用于记录到(开始标记符‘#')标志位
void USART_ENBEN()
{
    static u8 buf[32]= {0};
    u8 h_buf;

    u8 i,j;

    h_buf = USART_ReceiveData(USART1);
    if(flag_h == 0 && h_buf=='#')
    {
        flag_h=1;
        return;
    }
    if(flag_h)
    {
        buf[count++] = h_buf;
        if(buf[count-1]!='.') {
            USART_SendData(USART1,buf[count-1]);
        }
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
        //接收完成
        if(buf[count-1]=='.')
        {
            //数据转移
            for(i=0; i<=count-1; i++)
            {
                USART_Rx_buf[i]=buf[i];
            }
            //数据清空(数据,计数值)
            for(j=0; j<count; j++)
            {
                buf[j]='\0';
            }
            count=0;
            //接收完成标志位
            USART_Rx_flag=1;
            flag_h = 0;
            USART_ClearFlag(USART1,USART_FLAG_TXE);
        }
    }
}

//串口输出字符串
//假如string中没有'\0',会额外发送一些数据
void USART_SendString(USART_TypeDef* USARTx, char *DataString)
{
    int i = 0;
    USART_ClearFlag(USARTx,USART_FLAG_TXE);
    if(flag_h ==0)
    {
        while(DataString[i] != '\0')
        {
            USART_SendData(USARTx,DataString[i]);
            while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) == 0);
            USART_ClearFlag(USARTx,USART_FLAG_TXE);
            i++;
        }
    }
}

//这只是串口配置 使用请看(二)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值