查看: 4816|回复: 1

GD32F450--GPIO/UART/TIMER/NVIC

[复制链接]
  • TA的每日心情
    开心
    2017-6-7 17:49
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-6-9 15:35:19 | 显示全部楼层 |阅读模式
    分享到:
    由于之前一直没时间,最近才拿到开始玩,搭建环境不多说了,前面很多人已经弄过了。

    参考了官方的Firmware Library重新建立了自己的工程

    工程.PNG

    如图,官方标准驱动库太长没有展开,BSP是我自己写的驱动文件 共包含 GPIO/UART/TIME/NVIC

    1.GPIO
    bsp_gpio.h   
    1. /******************************************************************************
    2. * File       : bsp_gpio.h
    3. * Function   : IO初始化
    4. * Description: None         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-21                                        |WXP                                        |IO初始化
    11. ******************************************************************************/
    12. #ifndef __BSP_GPIO_H__
    13. #define __BSP_GPIO_H__

    14. #ifdef __cplusplus
    15. extern "C" {
    16. #endif
    17.          
    18. #include "gd32f4xx.h"
    19.          
    20. #define ON (1)
    21. #define OFF (0)
    22.        
    23. /*
    24. * LED4--PB4
    25. * LED6--PB3
    26. * LED5--PD7
    27. */         

    28. #define LED4(a)                        if(a)        gpio_bit_set(GPIOB,GPIO_PIN_4); \
    29.                                                                         else                gpio_bit_reset(GPIOB,GPIO_PIN_4);
    30.          
    31. #define LED5(a)                        if(a)        gpio_bit_set(GPIOD,GPIO_PIN_7); \
    32.                                                                         else                gpio_bit_reset(GPIOD,GPIO_PIN_7);

    33. #define LED6(a)                        if(a)        gpio_bit_set(GPIOB,GPIO_PIN_3); \
    34.                                                                         else                gpio_bit_reset(GPIOB,GPIO_PIN_3);

    35. #define LED4_Toggle()                gpio_bit_toggle(GPIOB,GPIO_PIN_4)
    36. #define LED5_Toggle()                gpio_bit_toggle(GPIOD,GPIO_PIN_7)
    37. #define LED6_Toggle()                gpio_bit_toggle(GPIOB,GPIO_PIN_3)

    38. void bsp_led_init(void);//LED初始化         
    39.          
    40. #ifdef __cplusplus
    41. }
    42. #endif
    43.          
    44. #endif       
    45.                

    复制代码
    bsp_gpio.c
    1. #include "bsp_gpio.h"


    2. /*
    3. * LED4--PB4
    4. * LED6--PB3
    5. * LED5--PD7
    6. */         


    7. /******************************************************************************
    8. * Name       : void bsp_led_init(void)
    9. * Function   : LED初始化
    10. * Input      : None
    11. * Output:    : None
    12. * Return     : None
    13. * Version    : V1.00
    14. * Author     : WXP
    15. * Date       :
    16. * Description:
    17. ******************************************************************************/
    18. void bsp_led_init(void)
    19. {

    20.     rcu_periph_clock_enable(RCU_GPIOB);
    21.         rcu_periph_clock_enable(RCU_GPIOD);
    22.   
    23.     gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_4);//设为输出
    24.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4);//推挽
    25.        
    26.         gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_3);//设为输出
    27.     gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_3);//推挽
    28.        
    29.         gpio_mode_set(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_7);//设为输出
    30.     gpio_output_options_set(GPIOD, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);//推挽
    31.        
    32.        
    33.     gpio_bit_reset(GPIOB,GPIO_PIN_4);//输出低电平 灭
    34.         gpio_bit_reset(GPIOB,GPIO_PIN_3);//输出低电平 灭
    35.         gpio_bit_reset(GPIOD,GPIO_PIN_7);//输出低电平 灭
    36. }
    复制代码
    GPIO中只有简单的控制3个LED等
    PB4--LED4
    PD7--LED5
    PB3--LED6




    2.UART
    bsp_uart.h  
    1. /******************************************************************************
    2. * File       : bsp_usart.h
    3. * Function   : ′??ú?y?ˉí·???t
    4. * Description: None         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-21                                        |WXP                                        |3?′?′′?¨
    11. ******************************************************************************/
    12. #ifndef __BSP_USART_H__
    13. #define __BSP_USART_H__

    14. #ifdef __cplusplus
    15. extern "C" {
    16. #endif
    17.          

    18. #include "gd32f4xx.h"
    19. #include "stdio.h"
    20. #include "systick.h"
    21.          
    22.          
    23. #define DEBUG_UART USART2         
    24.          

    25. /*
    26. * USART0   PA9--TXD   PA10--RXD
    27. * USART1   PA2--TXD   PA3---RXD
    28. * USART2   PB10-TXD   PB11--RXD   PD8--TXD   PD9--RXD
    29. * UART3    PC10-TXD   PC11--RXD
    30. * UART4           PC12-TXD   PD2---RXD  
    31. * USART5   PC6--TXD   PC7---RXD         
    32. */         
    33.          
    34. void USART0_Init(uint32_t baud);//用作modbus-485
    35. void USART2_Init(uint32_t baud);//printf         
    36.          




    37. #ifdef __cplusplus
    38. }
    39. #endif
    40.          
    41. #endif       
    42.                

    复制代码
    bsp_uart.c
    1. #include "bsp_uart.h"


    2. /*
    3. * USART0   PA9--TXD   PA10--RXD
    4. * USART1   PA2--TXD   PA3---RXD
    5. * USART2   PB10-TXD   PB11--RXD   PD8--TXD   PD9--RXD
    6. * UART3    PC10-TXD   PC11--RXD
    7. * UART4           PC12-TXD   PD2---RXD  
    8. * USART5   PC6--TXD   PC7---RXD         
    9. */         


    10. /******************************************************************************
    11. * Name       : void USART0_Init(uint32_t)
    12. * Function   : USART0初始化
    13. * Input      : None
    14. * Output:    : None
    15. * Return     : None
    16. * Version    : V1.00
    17. * Author     : WXP
    18. * Date       :
    19. * Description:
    20. * USART0   PA9--TXD   PA10--RXD
    21. * USART_INTEN_PERRIE: 校验错误中断
    22. * USART_INTEN_TBEIE:  发送缓冲区空中断
    23. * USART_INTEN_TCIE:   发送完成中断
    24. * USART_INTEN_RBNEIE: 读接受缓冲区非空或溢出中断
    25. * USART_INTEN_RTIE:   接收超时中断
    26. ******************************************************************************/
    27. void USART0_Init(uint32_t baud)
    28. {
    29.         rcu_periph_clock_enable(RCU_GPIOA);
    30.         rcu_periph_clock_enable(RCU_USART0);
    31.        
    32.         gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_9);
    33.         gpio_af_set(GPIOA,GPIO_AF_7,GPIO_PIN_10);
    34.        
    35.         gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_9);
    36.         gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
    37.        
    38.         gpio_mode_set(GPIOA,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_10);
    39.         gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_10);
    40.        
    41.         usart_deinit(USART0);
    42.         usart_baudrate_set(USART0,baud);       
    43.         usart_receive_config(USART0,USART_RECEIVE_ENABLE);
    44.         usart_transmit_config(USART0,USART_TRANSMIT_ENABLE);
    45.         usart_interrupt_enable(USART0,USART_INTEN_RBNEIE);//使能接受中断(读接受缓冲区非空)
    46.         usart_interrupt_disable(USART0,USART_INTEN_TBEIE);//禁止发送缓冲区空中断
    47.         usart_enable(USART0);
    48. }       




    49. /******************************************************************************
    50. * Name       : void USART2_Init(uint32_t)
    51. * Function   : USART2初始化
    52. * Input      : None
    53. * Output:    : None
    54. * Return     : None
    55. * Version    : V1.00
    56. * Author     : WXP
    57. * Date       :
    58. * Description:
    59. * USART0   PD8--TXD   PD9--RXD
    60. * USART_INTEN_PERRIE: 校验错误中断
    61. * USART_INTEN_TBEIE:  发送缓冲区空中断
    62. * USART_INTEN_TCIE:   发送完成中断
    63. * USART_INTEN_RBNEIE: 读接受缓冲区非空或溢出中断
    64. * USART_INTEN_RTIE:   接收超时中断
    65. ******************************************************************************/
    66. void USART2_Init(uint32_t baud)
    67. {
    68.         rcu_periph_clock_enable(RCU_GPIOD);
    69.         rcu_periph_clock_enable(RCU_USART2);
    70.        
    71.         gpio_af_set(GPIOD,GPIO_AF_7,GPIO_PIN_8);//GPIO_AF_7: USART0, USART1, USART2
    72.         gpio_af_set(GPIOD,GPIO_AF_7,GPIO_PIN_9);
    73.        
    74.         gpio_mode_set(GPIOD,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_8);
    75.         gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_8);
    76.        
    77.         gpio_mode_set(GPIOD,GPIO_MODE_AF,GPIO_PUPD_PULLUP,GPIO_PIN_9);
    78.         gpio_output_options_set(GPIOD,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9);
    79.        
    80.         usart_deinit(USART2);
    81.         usart_baudrate_set(USART2,baud);       
    82.         usart_receive_config(USART2,USART_RECEIVE_ENABLE);
    83.         usart_transmit_config(USART2,USART_TRANSMIT_ENABLE);
    84.         usart_interrupt_enable(USART2,USART_INTEN_RBNEIE);//使能接受中断(读接受缓冲区非空)
    85.         usart_interrupt_disable(USART2,USART_INTEN_TBEIE);//禁止发送缓冲区空中断
    86.         usart_enable(USART2);
    87. }       
    88.        

    89. int fputc(int ch, FILE *f)
    90. {
    91.         usart_data_transmit(DEBUG_UART,(uint8_t)ch);
    92.         while(RESET == usart_flag_get(DEBUG_UART,USART_FLAG_TBE));//等待发送完成
    93.         return ch;
    94.        
    95. }
    复制代码
    这里用了两个uart,一个用作debug(printf),一个预备当做modbus-485接口


    3.TIMER
    bsp_time.h
    1. /******************************************************************************
    2. * File       : bsp_time.h
    3. * Function   : 定时器驱动头文件
    4. * Description: 包含全部的BSP驱动         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-26                                        |WXP                                        |初次创建
    11. ******************************************************************************/
    12. #ifndef __BSP_TIME_H__
    13. #define __BSP_TIME_H__

    14. #ifdef __cplusplus
    15. extern "C" {
    16. #endif


    17. #include "gd32f4xx.h"

    18. /*
    19. TIM0/TIM7                                   高级定时器
    20. TIM1/TIM2/TIM3/TIM4                         通用定时器L0
    21. TIM8/TIM11                                        通用定时器L1
    22. TIM9/TIM10/TIM12/TIM13            通用定时器L2
    23. TIM5/TIM6                                        基本定时器
    24.          
    25. 定时器                TIM0/7                TIM1-4                TIM8/11                TIM9-13                TIM5/6
    26. 类型                高级                通用(L0)        通用(L1)        通用(L2)        基本
    27. 预分频器        16位                16位                16位                16位                16位
    28. 计时器                16位                16位(2/3)        16位                16位                16位
    29.                                                 32位(1/4)
    30. 计数模式        向上                向上                向上                向上                向上
    31.                         向下                向下
    32.                         中央对齐        中央对齐
    33. 捕获/比较        4                        4                        2                        1                        0
    34. 可重复性        Y                        N                        N                        N                        N
    35. 互补死区        Y                        N                        N                        N                        N
    36. 中止输入        Y                        N                        N                        N                        N
    37. 单脉冲                Y                        Y                        Y                        N                        Y
    38. 正交解码        Y                        Y                        N                        N                        N
    39. 从设备控制        Y                        Y                        Y                        N                        N
    40. */         
    41.          
    42.          
    43.          
    44. void TIM6_Init(uint16_t arr,uint16_t psc);
    45.          

    46. #ifdef __cplusplus
    47. }
    48. #endif         
    49.          
    50. #endif       
    复制代码
    bsp_time.c
    1. /******************************************************************************
    2. * File       : bsp_time.c
    3. * Function   : 定时器驱动源文件
    4. * Description: None         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-26                                        |WXP                                        |初次创建
    11. ******************************************************************************/

    12. #include "bsp_time.h"
    13. #include "bsp_nvic.h"
    14. #include "bsp_uart.h"
    15. #include "bsp_gpio.h"




    16. /******************************************************************************
    17. * Name       : void TIM6_Init(uint16_t arr,uint16_t psc)
    18. * Function   : 定时器6初始化
    19. * Input      : u16 arr 重装载值   psc  预分频值
    20. * Output:    : None
    21. * Return     : None
    22. * Version    : V1.00
    23. * Author     : WXP
    24. * Date       : 2017-6-9
    25. * Description: T=(((arr+1)/120000000)/psc)秒
    26. ******************************************************************************/
    27. void TIM6_Init(uint16_t arr,uint16_t psc)
    28. {
    29.         timer_parameter_struct timer_initpara;
    30.        
    31.         rcu_periph_clock_enable(RCU_TIMER6);
    32.        
    33.         rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4);
    34.        
    35.         timer_deinit(TIMER6);
    36.        
    37.         timer_initpara.prescaler = psc;//预分频值  120M/(11999+1)=0.01M  
    38.         timer_initpara.alignedmode         = TIMER_COUNTER_EDGE;//TIMER_COUNTER_CENTER_UP
    39.         timer_initpara.counterdirection = TIMER_COUNTER_UP;
    40.         timer_initpara.period = arr;//1M/(9999+1)=10000 10000/0.01M=1s中断一次
    41.         timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
    42.         timer_initpara.repetitioncounter = 0;
    43.         timer_init(TIMER6,&timer_initpara);
    44.        
    45.         timer_auto_reload_shadow_enable(TIMER6);//使能预装载
    46.         timer_flag_clear(TIMER6,TIMER_FLAG_UP);//清除更新标志位
    47.         timer_interrupt_enable(TIMER6,TIMER_INT_UP);//使能更新中断
    48.         timer_enable(TIMER6);
    49.        
    50. }


    51. void TIMER6_IRQHandler(void)
    52. {
    53.         if(RESET != timer_interrupt_flag_get(TIMER6,TIMER_INT_UP))
    54.         {
    55.                 printf("TIM6 Runing\r\n");
    56.                 LED4_Toggle();
    57.                 timer_interrupt_flag_clear(TIMER6,TIMER_INT_UP);
    58.         }
    59. }

    复制代码
    这里只简单的用了一个基本定时器TIMER6,1S打印1句话,然后翻转LED4



    4.NVIC
    bsp_nvic.h
    1. /******************************************************************************
    2. * File       : bsp_nvic.h
    3. * Function   : 中断配置头文件
    4. * Description: None         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-26                                        |WXP                                        |初次创建
    11. ******************************************************************************/
    12. #ifndef __BSP_NVIC_H__
    13. #define __BSP_NVIC_H__

    14. #ifdef __cplusplus
    15. extern "C" {
    16. #endif
    17.          
    18. #include "gd32f4xx.h"


    19. void NVIC_Config(void);                       
    20.          
    21.          
    22. #ifdef __cplusplus
    23. }
    24. #endif
    25.          
    26. #endif       
    复制代码
    bsp_nvic.c
    1. /******************************************************************************
    2. * File       : bsp_nvic.h
    3. * Function   : 中断配置源文件
    4. * Description: None         
    5. * Version    : V1.00
    6. * Author     : WXP
    7. * Date       :
    8. * History    :  
    9. *        No.                                        |Date                                                |Author                                        |Description
    10.         1                                        |2017-4-21                                        |WXP                                        |初次创建
    11. ******************************************************************************/
    12. #include "bsp_nvic.h"
    13. /*
    14. 中断分配说明,优先级由高向低排
    15. 顺序       类型            作用                   抢占优先级      响应优先级

    16. */



    17. void NVIC_Config(void)
    18. {

    19.         /* 配置中断使用组合  抢占式3位(0-7),响应式1位(0-1) */
    20.         nvic_priority_group_set(NVIC_PRIGROUP_PRE3_SUB1);
    21.        

    22.         nvic_irq_enable(USART0_IRQn,1,1);

    23.         nvic_irq_enable(TIMER6_IRQn,2,1);

    24.         nvic_irq_enable(USART2_IRQn,3,1);
    25. }

    复制代码
    nvic用来分配中断优先级

    5.bsp
    1. #include "bsp.h"


    2. /******************************************************************************
    3. * Name       : void Bsp_Init(void)
    4. * Function   : BSP初始化
    5. * Input      : None
    6. * Output:    : None
    7. * Return     : None
    8. * Version    : V1.00
    9. * Author     : WXP
    10. * Date       :
    11. * Description:
    12. ******************************************************************************/
    13. void Bsp_Init(void)
    14. {
    15.         NVIC_Config();                                //中断初始化  分配优先级
    16.        
    17.         systick_config();                        //SYSTICK 初始化
    18.        
    19.         bsp_led_init();                                //LED初始化
    20.        
    21.         USART0_Init(115200);                //UART0初始化  PA9--TXD  PA10--RXD

    22.         USART2_Init(115200);                //USART2初始化 PD8--TXD  PD9--RXD  DEBUG_UART
    23.        
    24.         TIM6_Init(9999,11999);                //TIMER6初始化   1S中断一次  
    25.        
    26. }
    27.        
    复制代码
    最后main函数如下
    1. #include "gd32f4xx.h"
    2. #include "gd32f4xx_eval.h"
    3. #include "bsp.h"




    4. int main(void)
    5. {

    6.         Bsp_Init();
    7.        
    8.         printf("This is a GD32F450 demo\n");

    9.     while(1)
    10.         {
    11.                 LED5_Toggle();
    12.                 delay_1ms(300);   
    13.         }
    14. }
    复制代码
    运行的效果就是LED4每一秒闪烁一次,LED5每300ms闪烁一次,然后每一秒打印一句话
    打印.PNG


    最后上传我的Demo







    Demo.rar

    7.21 MB, 下载次数: 103

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-5-10 20:09
  • 签到天数: 1742 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-6-12 11:42:37 | 显示全部楼层
    感谢分享!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-15 08:16 , Processed in 0.130655 second(s), 18 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.