查看: 17136|回复: 15

STM32F0 #02进程帖(一)---LED闪灯和串口通信功能的实现

  [复制链接]
  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-10-30 21:21:24 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 fengye5340 于 2012-11-29 19:53 编辑

              STM32F0 #02进程一:
              自从收到了爱板网给的STM32F0小板后,就开始趁着休息时间鼓弄,呵呵。原来的小板已经送给朋友一块,给同事玩一块,好久没有摸它,感觉真是太陌生了。本人拿到这个小板后,面前做了三个方面的工作。
               第一个,给板子增加了一个8MHZ的外部晶振,以实现更精确的时钟和延时控制。 这个板子的器件都用0603的贴片,我们这里以0805最多,0603的型号不全,后来又去了库里才把上面的几个元件找全,真个费劲啊,焊的时间很短,还不够找一个器件的功夫。焊完后,用了程序一测,OK!高兴的我立马去吃饭了。
               第二个,利用SYSTICK定时器实现了豪秒级精确延时,目前仅用来 测试LED灯,后续,如果需要更精准的延时,会增加定时器模块。把程序下载进去后,小灯延时正确无误。  
               第三个,增加了串口通信模块。这个是从偶的LM3S系列串口程序上移植过来的,虽说串口通信简单,不过STM32F0的串口API库还是有不少函数的,如果前期不阅读好******usart.c那个库文件,整明白里面的串口API函数,编写这个模块还是需要花费一点时间的。有的人会说,STM32不是有现成的串口模块嘛,我会说,这个还是有很多差别。毕竟M0是小弟弟,武器不可能比哥哥的好。还有就是串口模块的中断方式实现,这个需要先在 NVIC里面做个配置,然后在***_it.c 增加中断处理即可,中间只要处理正确,就可以实现了。
                下面把把图传上来!感谢爱板网论坛!
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    串口部分源码;
    /*********************************Copyright (c)*********************************                                      
      *                              fengye5340@163.com                     
      ******************************************************************************
      * 文件名称:UART_51R8T6.C
      * 描    述:串口通信模块
      * 创 建 者: fengye5340
      * 创建日期:
      * 修 改 者:            
      * 修改日期: 2012-10-29      
      * 版    本: v1.0.0
      ******************************************************************************
      * attention
      *
      ******************************************************************************
      */
    /*Includes --------------------------------------------------------------------*/
      #include "stm32f0xx_usart.h"
    #include  "UART_51R8T6.H"
      #include <stdarg.h>
      #include <stdio.h>
    /* 类型定义 typedef-----------------------------------------------------------*/
    /* 预定义字符     ------------------------------------------------------------*/
    /* 宏定义        -------------------------------------------------------------*/
      #ifdef __GNUC__
      #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
      #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif
    /* 变量定义          ---------------------------------------------------------*/
    /*******************************************************************************
    * 函数名称: Uart_Init()
    * 功能描述: 串口初始化
    * 输入参数: void
    * 返回参数: 无
    ********************************************************************************/
    void Uart_Init(void)
    {
       
            GPIO_InitTypeDef  GPIO_InitStructure;
            USART_InitTypeDef USART_InitStructure;
                   
            RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);   // 使能GPIOB端口
            RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // 使能串口1时钟
                   
            GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1);
            GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_1);        
    /////////////////////////////////////////////////////////////////////////////////////        
            /*
            *  USART1_TX -> PA9 , USART1_RX ->        PA10
            */                                
            GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9|GPIO_Pin_10;                 
            GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
            GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
            GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
            GPIO_Init(GPIOA, &GPIO_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_HardwareFlowControl = USART_HardwareFlowControl_None;//设置流控制
            USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                //设置工作模式
            USART_Init(USART1, &USART_InitStructure);  //串口配置
            
            USART_ITConfig(USART1, USART_IT_RXNE,ENABLE); //打开中断
       
            USART_Cmd(USART1, ENABLE);//使能串口1

    }
    /*******************************************************************************
    * 函数名称: Uart_Put_Char()
    * 功能描述: 通过UART发送一个字符
    * 输入参数: void
    * 返回参数: 无
    ********************************************************************************/
    void Uart_Put_Char(unsigned char c)
    {   
         while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,c);  
         
       
    }
    /*******************************************************************************
    * 函数名称:  Uart_Put_string
    * 功能描述: 通过UART发送字符串
    * 输入参数: void
    * 返回参数: 无
    ********************************************************************************/
    void Uart_Put_string(unsigned char *s)
    {
        while (*s != '\0')
        {
          Uart_Put_Char(*(s++));
        }
    }
    /*******************************************************************************
    * 函数名称:  Uart_Put_string
    * 功能描述: 通过UART发送字符串
    * 输入参数: void
    * 返回参数: 无
    ********************************************************************************/
    void Uart_Char_Num( unsigned char *pucBuffer, unsigned long ulCount )
    {
         while(ulCount--)
        {
           Uart_Put_Char(*pucBuffer++);
        }
    }
    /*******************************************************************************
    * 函数名称: Uart_Get_Char()
    * 功能描述: 通过UART接收一个字符
    * 输入参数: void
    * 返回参数: 无
    ********************************************************************************/
    unsigned char Uart_Get_Char(void)
    {   
         unsigned char temp;
         while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空
         temp = (unsigned char)(USART_ReceiveData(USART1));
         return(temp);   
    }
    /*******************************************************************************
    函数名称:Display_ConfigMenu(void)
    功    能:默认配置下的显示菜单
    参    数:无
    返回值  :接收到的字符
    ********************************************************************************/
    void Display_ConfigMenu(void)
    {
         Uart_Put_string("---------STM32F0 DISCOVERY EVALUATION BOARD---------\r\n");
         Uart_Put_string("------------------EEboard爱板网论坛-----------------\r\n");
         Uart_Put_string("------------------ADC中断方式采集程序----——-------------\r\n");
        Uart_Put_string("------------------fengye5340@163.com----------------\r\n");
        Uart_Put_string("-------------------2012年11月22日--------------------\r\n");
    }
    /*******************************************************************************
    函数名称:PUTCHAR_PROTOTYPE
    功    能:串口实现Printf()函数功能
    参    数:无
    返回值  :
    ********************************************************************************/
    PUTCHAR_PROTOTYPE
    {
      while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      USART_SendData(USART1,(uint8_t)ch);
      return (ch);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    中断部分;
    extern unsigned char  g_inbuf1[2];     // 定义数据缓存器1--串口1缓冲器
    /*******************************************************************************
    * 函数名称: USART1_IRQHandler()
    * 功能描述: 串口1中断处理函数
    * 输入参数: void
    * 返回参数: 无
    * 说    明:可以随时用 USART_ITConfig(USART1, USART_IT_TXE, DISABLE);来关闭中断响应。
    ********************************************************************************/
    void USART1_IRQHandler(void)
    {   
       unsigned char uCh;
       while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//等待接收为空
        uCh = (unsigned char)(USART_ReceiveData(USART1)); // 接收单个字符                    
       g_inbuf1[0] = uCh ;     
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    中断管理
    /********************************************************************************
    函数名称:NVIC_config(void)
    功    能:NVIC配置
    参    数:无
    返 回 值:无
    *********************************************************************************/
    void NVIC_config(void)
    {
      /*1--串口中断管理*/
      NVIC_InitTypeDef  NVIC_InitStructure;
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);

       
      // 可以继续增加,设置中断优先级


    }




    硬件连接图秀秀

    硬件连接图秀秀
    20121030220.jpg

    界面-1秀秀

    界面-1秀秀

    界面-2秀秀

    界面-2秀秀
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-3-19 13:22
  • 签到天数: 805 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-10-31 08:49:54 | 显示全部楼层
    帮顶一下......
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-10-31 10:17:40 | 显示全部楼层
    powerdruy 发表于 2012-10-31 09:06
    代码都不放出来啊,让我等没玩过Cortex-m0/m3的人情何以堪

    现在放的是过程,最后肯定是要上传全部代码的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-10-31 20:27:21 | 显示全部楼层
    powerdruy 发表于 2012-10-31 15:39
    跪求你的串口模块代码啊,我整了一天也没搞清楚NVIC在哪里

    我代码在办公室啊,等明天发给你一份,给我个邮件
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-11-29 19:34:18 | 显示全部楼层
    fengye5340 发表于 2012-10-31 20:27
    我代码在办公室啊,等明天发给你一份,给我个邮件

    大神,小弟也想要一份串口部分的代码啊,跪谢!littleway2012@gmail.com
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-29 19:55:05 | 显示全部楼层
    littleway 发表于 2012-11-29 19:34
    大神,小弟也想要一份串口部分的代码啊,跪谢!

    已经把代码放到帖子里了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-1-5 09:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-11-30 08:09:43 | 显示全部楼层
    fengye5340 发表于 2012-11-29 19:55
    已经把代码放到帖子里了

    非常感谢!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2012-12-20 19:40
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2013-1-4 19:34:50 | 显示全部楼层
    楼主太强大了,膜拜
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2015-12-14 11:43
  • 签到天数: 556 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-1-4 20:05:17 | 显示全部楼层
    lz很厉害啊
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-25 12:42
  • 签到天数: 692 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-1-4 20:26:30 | 显示全部楼层
    楼主谦虚,这个只是些基本的程序,呵呵
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 08:10 , Processed in 0.187938 second(s), 33 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.