查看: 1054|回复: 5

[原创DIY] STM32单片机串口通讯代码

[复制链接]

107

主题

11

好友

1583

积分

版主

Rank: 7Rank: 7Rank: 7

  • TA的每日心情
    奋斗
    2013-7-4 23:49
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    论坛版主职务勋章

    发表于 2014-5-8 17:30:14 |显示全部楼层
    在STM32开发中,串口是我们最常用的接口。通过串口,我们很方便地把数据输出到电脑,方便我们进行程序调试。下面我们来看看STM32的串口通讯代码。
    要实现串口通讯,我们要进行下面几个步骤:
    首先:要打开GPIO口的时钟和串口模块时钟。在圆点博士小四轴中,我们用的是GPIOA和COM1模块。
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
    其次:要指定GPIO口,即确定哪些IO是用于串口通讯的。记得使用GPIO_Mode_AF_PP模式
      GPIO_InitStructure.GPIO_Pin = BS004_COM1_TX;     //圆点博士:设置PA9管脚为串口TX
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //圆点博士:设置串口TX最大允许输出速度
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //圆点博士:设置串口TX为输出
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    //
      GPIO_InitStructure.GPIO_Pin = BS004_COM1_RX;     //圆点博士:设置PA9管脚为串口RX
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //圆点博士:设置串口RX为输入
      GPIO_Init(GPIOA, &GPIO_InitStructure);
    第三步:设置串口模块参数,如波特率,奇偶校验这些。
      USART_InitStructure.USART_BaudRate = 115200;         //圆点博士:设置串口波特率为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);   //圆点博士:设置串口参数
    第四步:如果使用串口中断的话,还要设置中断优先级。下面例子设置为最高优先级0。
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    最后一步,就是打开中断,并使能串口模块拉。
      USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //圆点博士:允许接收中断
      USART_Cmd(USART1, ENABLE);
    上面例子只启动了接收中断。这样,当STM32串口接收到数据的时候,代码就会自动跳转到中断代码里面执行对应的操作。
    那么,对于发送,怎么办呢? 我们采用查询的方式来发送。
    void BS004_COM1_Send_Char(unsigned char ascii_code)       //圆点博士:发送一个字符
    {
      USART_SendData(USART1,ascii_code);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //圆点博士:等待直到发送完成
    }
    如过要发送单字符,使用下面的方法:
    BS004_COM1_Send_Char('/');                //圆点博士:发送字符/
    BS004_COM1_Send_Char(13);                 //圆点博士:发送回车字符
    如过要发送字符串,则使用下面的方法。
    void BS004_COM1_Send_Str_Body(unsigned char* str_buf)  //圆点博士:发送一个指定长度的字符串
    {
    unsigned char i,str_len;
    str_len=0;
    for(i=0;i<64;i++)
    {
      str_len++;
      if(str_buf=='.') break;
    }
      for(i=0;i
    }
    在上面的例子中,使用了符号.作为字符串结束标志。

    回复

    使用道具 举报

    无效楼层,该帖已经被删除

    57

    主题

    16

    好友

    4272

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    2015-11-4 08:32
  • 签到天数: 773 天

    [LV.10]以坛为家III

    发表于 2014-5-8 21:38:05 |显示全部楼层
    谢谢分享,
    回复

    使用道具 举报

    1

    主题

    0

    好友

    389

    积分

    秀才

    Rank: 3Rank: 3

  • TA的每日心情

    2014-6-8 16:43
  • 签到天数: 46 天

    [LV.5]常住居民I

    爱板会员勋章

    发表于 2014-5-8 23:56:29 |显示全部楼层
    GOOD!!!!!!!!!!!!!!!!
    回复

    使用道具 举报

    3

    主题

    4

    好友

    5492

    积分

    状元

    Rank: 6Rank: 6

  • TA的每日心情
    奋斗
    13 小时前
  • 签到天数: 770 天

    [LV.10]以坛为家III

    发表于 2014-8-14 13:19:59 |显示全部楼层
    东西挺好的   就是不知道能不能给出代码
    回复

    使用道具 举报

    0

    主题

    6

    好友

    101

    积分

    童生

    Rank: 2

  • TA的每日心情
    慵懒
    2014-8-28 15:24
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2014-8-15 10:00:04 |显示全部楼层
    顶!!!!
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-2-21 22:24 , Processed in 0.173614 second(s), 15 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部