1回答

2收藏

GD32F450--GPIO/UART/TIMER/NVIC

GD32 GD32 6124 人阅读 | 1 人回复 | 2017-06-09

由于之前一直没时间,最近才拿到开始玩,搭建环境不多说了,前面很多人已经弄过了。

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



如图,官方标准驱动库太长没有展开,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闪烁一次,然后每一秒打印一句话



最后上传我的Demo







Demo.rar

7.21 MB, 下载次数: 103

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

jinglixixi

发表于 2017-6-12 11:42:37 | 只看该作者

感谢分享!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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