[MM32硬件] 【MM32F5270开发板试用】+串口中断接收与定时器

[复制链接]
 楼主| gaonaiweng 发表于 2022-12-24 15:07 | 显示全部楼层 |阅读模式
准备工作

PLUS-F5270开发板基于灵动MM32F5系列芯片的Armv8-M 架构的 “星辰” STAR-MC1 处理器,资料链接:https://aijishu.com/a/1060000000341750。
试用前准备好开发环境Keil 3.7以及安装当前灵动官网固件包MindMotion.MM32F5277E_DFP.0.0.6.pack。在https://mindsdk.mindmotion.com.cn/注册并配置下载MindSDK。
8869463a6a536816ba.png


评论

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_47569031/article/details/127365268 ———————————————— 版权声明:本文为CSDN博主「极术社区」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_47569031/article  发表于 2022-12-24 15:09
 楼主| gaonaiweng 发表于 2022-12-24 15:10 | 显示全部楼层
准备实验的功能

2.1 PC端串口发送 FF FF XX 12 DD,XX低4位控制4个LED的亮灭,1亮0灭,最低位bit0对应LED1,bit1对应LED2,bit2对应LED3,bit3对应LED4;

2.2 定时中断1秒,每秒串口打印指定内容;

8573163a6a5a95154a.png
 楼主| gaonaiweng 发表于 2022-12-24 15:15 | 显示全部楼层

2421363a6a6003c349.png
实现过程相关代码

以SDK中“uart_rx_interrupt”工程作为基础,里面添加相关功能函数与定义。
 楼主| gaonaiweng 发表于 2022-12-24 15:20 | 显示全部楼层
时钟初始化

在clock_init.c里void BOARD_InitBootClocks(void)添加LED与定时器的时钟。
 楼主| gaonaiweng 发表于 2022-12-24 15:21 | 显示全部楼层
  1. void BOARD_InitBootClocks(void)
  2. {
  3.     CLOCK_ResetToDefault();
  4.     CLOCK_BootToHSE120MHz();

  5.     /* UART1. */
  6.     RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_UART1, true);
  7.     RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_UART1);

  8.     /* GPIOB. */
  9.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOB, true);
  10.     RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOB);
  11.         /* GPIOC. */
  12.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOC, true);
  13.     RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOC);
  14.         /* GPIOD. */
  15.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOD, true);
  16.     RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOD);

  17.     /* GPIOI. */
  18.     RCC_EnableAHB1Periphs(RCC_AHB1_PERIPH_GPIOI, true);
  19.     RCC_ResetAHB1Periphs(RCC_AHB1_PERIPH_GPIOI);
  20.     /* TIM1. */
  21.     RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_TIM1, true);
  22.     RCC_ResetAPB2Periphs(RCC_APB2_PERIPH_TIM1);
  23. }
 楼主| gaonaiweng 发表于 2022-12-24 15:24 | 显示全部楼层
添加LED与TIM1宏定义

board_init.h
  1. #ifndef __BOARD_INIT_H__
  2. #define __BOARD_INIT_H__

  3. #include <stdio.h>
  4. #include "hal_common.h"
  5. #include "clock_init.h"
  6. #include "hal_tim.h"
  7. #include "hal_uart.h"
  8. #include "pin_init.h"
  9. #include "hal_gpio.h"
  10. #include "string.h"

  11. /* LED. */
  12. #define LED1ON  GPIO_WriteBit(GPIOI, GPIO_PIN_0, 0u)
  13. #define LED1OFF GPIO_WriteBit(GPIOI, GPIO_PIN_0, 1u)
  14. #define LED2ON  GPIO_WriteBit(GPIOD, GPIO_PIN_2, 0u)
  15. #define LED2OFF GPIO_WriteBit(GPIOD, GPIO_PIN_2, 1u)
  16. #define LED3ON  GPIO_WriteBit(GPIOB, GPIO_PIN_14, 0u)
  17. #define LED3OFF GPIO_WriteBit(GPIOB, GPIO_PIN_14, 1u)
  18. #define LED4ON  GPIO_WriteBit(GPIOC, GPIO_PIN_9, 0u)
  19. #define LED4OFF GPIO_WriteBit(GPIOC, GPIO_PIN_9, 1u)

  20. /* DEBUG UART. */
  21. #define BOARD_DEBUG_UART_PORT        UART1
  22. #define BOARD_DEBUG_UART_BAUDRATE    9600u
  23. #define BOARD_DEBUG_UART_FREQ        CLOCK_APB2_FREQ
  24. #define BOARD_DEBUG_UART_IRQn        UART1_IRQn
  25. #define BOARD_DEBUG_UART_IRQHandler  UART1_IRQHandler

  26. /* TIM1. */
  27. #define BOARD_TIM_PORT              (TIM_Type *)TIM1
  28. #define BOARD_TIM_IRQn              TIM1_UP_IRQn
  29. #define BOARD_TIM_IRQHandler        TIM1_UP_IRQHandler
  30. #define BOARD_TIM_FREQ              CLOCK_SYS_FREQ

  31. void BOARD_Init(void);
  32. #endif /* __BOARD_INIT_H__ */
 楼主| gaonaiweng 发表于 2022-12-24 15:25 | 显示全部楼层
添加LED与TIM1宏定义

board_init.h
  1. #ifndef __BOARD_INIT_H__
  2. #define __BOARD_INIT_H__

  3. #include <stdio.h>
  4. #include "hal_common.h"
  5. #include "clock_init.h"
  6. #include "hal_tim.h"
  7. #include "hal_uart.h"
  8. #include "pin_init.h"
  9. #include "hal_gpio.h"
  10. #include "string.h"

  11. /* LED. */
  12. #define LED1ON  GPIO_WriteBit(GPIOI, GPIO_PIN_0, 0u)
  13. #define LED1OFF GPIO_WriteBit(GPIOI, GPIO_PIN_0, 1u)
  14. #define LED2ON  GPIO_WriteBit(GPIOD, GPIO_PIN_2, 0u)
  15. #define LED2OFF GPIO_WriteBit(GPIOD, GPIO_PIN_2, 1u)
  16. #define LED3ON  GPIO_WriteBit(GPIOB, GPIO_PIN_14, 0u)
  17. #define LED3OFF GPIO_WriteBit(GPIOB, GPIO_PIN_14, 1u)
  18. #define LED4ON  GPIO_WriteBit(GPIOC, GPIO_PIN_9, 0u)
  19. #define LED4OFF GPIO_WriteBit(GPIOC, GPIO_PIN_9, 1u)

  20. /* DEBUG UART. */
  21. #define BOARD_DEBUG_UART_PORT        UART1
  22. #define BOARD_DEBUG_UART_BAUDRATE    9600u
  23. #define BOARD_DEBUG_UART_FREQ        CLOCK_APB2_FREQ
  24. #define BOARD_DEBUG_UART_IRQn        UART1_IRQn
  25. #define BOARD_DEBUG_UART_IRQHandler  UART1_IRQHandler

  26. /* TIM1. */
  27. #define BOARD_TIM_PORT              (TIM_Type *)TIM1
  28. #define BOARD_TIM_IRQn              TIM1_UP_IRQn
  29. #define BOARD_TIM_IRQHandler        TIM1_UP_IRQHandler
  30. #define BOARD_TIM_FREQ              CLOCK_SYS_FREQ

  31. void BOARD_Init(void);
  32. #endif /* __BOARD_INIT_H__ */
 楼主| gaonaiweng 发表于 2022-12-24 15:26 | 显示全部楼层
配置IO口

pin_init.c
  1. #include "pin_init.h"
  2. #include "hal_rcc.h"
  3. #include "hal_gpio.h"

  4. void BOARD_InitPins(void)
  5. {
  6.     /* PB6 - UART1_TX. */
  7.     GPIO_Init_Type gpio_init;
  8.     gpio_init.Pins  = GPIO_PIN_6;
  9.     gpio_init.PinMode  = GPIO_PinMode_AF_PushPull;
  10.     gpio_init.Speed = GPIO_Speed_50MHz;
  11.     GPIO_Init(GPIOB, &gpio_init);
  12.     GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_7);

  13.     /* PB7 - UART1_RX. */
  14.     gpio_init.Pins  = GPIO_PIN_7;
  15.     gpio_init.PinMode  = GPIO_PinMode_In_Floating;
  16.     gpio_init.Speed = GPIO_Speed_50MHz;
  17.     GPIO_Init(GPIOB, &gpio_init);
  18.     GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_7);

  19.     /* PI0 - LED1. */
  20.     gpio_init.Pins  = GPIO_PIN_0;
  21.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  22.     gpio_init.Speed = GPIO_Speed_50MHz;
  23.     GPIO_Init(GPIOI, &gpio_init);
  24.     GPIO_PinAFConf(GPIOI, gpio_init.Pins, GPIO_AF_15);
  25.          /* PD2 - LED2. */
  26.     gpio_init.Pins  = GPIO_PIN_2;
  27.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  28.     gpio_init.Speed = GPIO_Speed_50MHz;
  29.     GPIO_Init(GPIOD, &gpio_init);
  30.     GPIO_PinAFConf(GPIOD, gpio_init.Pins, GPIO_AF_15);
  31.             /* PB14 - LED3. */
  32.     gpio_init.Pins  = GPIO_PIN_14;
  33.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  34.     gpio_init.Speed = GPIO_Speed_50MHz;
  35.     GPIO_Init(GPIOB, &gpio_init);
  36.     GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_15);
  37.             /* PD2 - LED4. */
  38.     gpio_init.Pins  = GPIO_PIN_9;
  39.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  40.     gpio_init.Speed = GPIO_Speed_50MHz;
  41.     GPIO_Init(GPIOC, &gpio_init);
  42.     GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_15);
  43. }
 楼主| gaonaiweng 发表于 2022-12-24 15:27 | 显示全部楼层
主程序

main.c里包含定时器初始化与定时器中断处理,串口字符输出函数以及串口中断接收处理函数。
  1. #include <stdint.h>
  2. #include <stdio.h>
  3. #include "board_init.h"

  4. /*
  5. * Macros.
  6. */
  7. #define APP_UART_RX_BUFF_LEN 8u
  8. uint16_t i=0;
  9. uint8_t *LEDStatus;
  10. #define APP_TIM_UPDATE_PERIOD  2000u

  11. /*
  12. * Variables.
  13. */
  14. uint8_t  app_uart_rx_buff[APP_UART_RX_BUFF_LEN]= {0};
  15. uint32_t app_uart_rx_buff_idx = 0u;
  16. uint8_t USART_RX_STA=0;
  17. /*
  18. * Declerations.
  19. */
  20. void app_uart_init(void);
  21. void app_uart_rx_isr_hook(void);
  22. void app_uart_putchar(uint8_t c);
  23. void app_uart_putstr(uint8_t *str);
  24. void app_tim_init(void);

  25. /*
  26. * Functions.
  27. */

  28. void delayMS(uint16_t ms)
  29. {
  30.     uint16_t i=0,j=0;
  31.     for(i=0;i<1000;i++)
  32.     for(j=0;i<ms;j++);
  33. }

  34. int main(void)
  35. {   
  36.    BOARD_Init();
  37.    app_tim_init();
  38.    app_uart_init();
  39.    
  40.     LED1ON;
  41.     LED2ON;
  42.     LED3ON;
  43.     LED4ON;
  44.     printf(" 灵动PLUS-F5270开发板测试-安谋科技\r\n");

  45.     while (1)
  46.     {
  47.       if(USART_RX_STA ==1)
  48.         {
  49.         //app_uart_putstr((uint8_t *)app_uart_rx_buff);   
  50.         if(app_uart_rx_buff[0] == 0xFF &&app_uart_rx_buff[1] == 0xFF &&app_uart_rx_buff[4] == 0XDD)               
  51.          {
  52.             if((app_uart_rx_buff[2]&0x01) !=0) {LED1ON;printf("LED1 ON\r\n");}
  53.             else {LED1OFF;printf("LED1 OFF\r\n");}
  54.             if((app_uart_rx_buff[2]&0x02) !=0) {LED2ON;printf("LED2 ON\r\n");}
  55.              else {LED2OFF;printf("LED2 OFF\r\n");}
  56.             if((app_uart_rx_buff[2]&0x04) !=0) {LED3ON;printf("LED3 ON\r\n");}
  57.             else {LED3OFF;printf("LED3 OFF\r\n");}
  58.             if((app_uart_rx_buff[2]&0x08) !=0) {LED4ON;printf("LED4 ON\r\n");}
  59.             else {LED4OFF;printf("LED4 OFF\r\n");}         
  60.                      }               
  61.                   memset(app_uart_rx_buff,0,sizeof(app_uart_rx_buff));
  62. app_uart_rx_buff_idx = 0u;
  63. USART_RX_STA=0;                     
  64.                  }            
  65.          }   
  66. }

  67. void app_uart_init(void)
  68. {
  69.     UART_Init_Type uart_init;

  70.     /* Setup the xfer engine. */
  71.     uart_init.ClockFreqHz   = BOARD_DEBUG_UART_FREQ; /* 48mhz, APB2. */
  72.     uart_init.BaudRate      = BOARD_DEBUG_UART_BAUDRATE;
  73.     uart_init.WordLength    = UART_WordLength_8b;
  74.     uart_init.StopBits      = UART_StopBits_1;
  75.     uart_init.Parity        = UART_Parity_None;
  76.     uart_init.XferMode      = UART_XferMode_RxTx;
  77.     uart_init.HwFlowControl = UART_HwFlowControl_None;
  78.     UART_Init(BOARD_DEBUG_UART_PORT, &uart_init);

  79.     /* Enable RX interrupt. */
  80.     UART_EnableInterrupts(BOARD_DEBUG_UART_PORT, UART_INT_RX_DONE, true);
  81.     NVIC_EnableIRQ(BOARD_DEBUG_UART_IRQn);

  82.     /* Enable UART. */
  83.     UART_Enable(BOARD_DEBUG_UART_PORT, true);
  84. }


  85. //串口接收 以OX0D 0X0A为结尾
  86. void app_uart_rx_isr_hook(void)
  87. {
  88.     if ( (0u != (UART_INT_RX_DONE & UART_GetEnabledInterrupts(BOARD_DEBUG_UART_PORT)))
  89.         && (0u != (UART_INT_RX_DONE & UART_GetInterruptStatus(BOARD_DEBUG_UART_PORT))) )
  90.     {
  91.         app_uart_rx_buff[app_uart_rx_buff_idx] = UART_GetData(BOARD_DEBUG_UART_PORT); /* read data to clear rx interrupt bits. */
  92.         BOARD_LedOnTimeout(app_uart_rx_buff[app_uart_rx_buff_idx] % 4u + 1u);
  93.               app_uart_rx_buff_idx++;
  94.               if(app_uart_rx_buff[app_uart_rx_buff_idx-1] == 0x0A && app_uart_rx_buff[app_uart_rx_buff_idx-2] == 0x0D)
  95.                   USART_RX_STA = 1;
  96.     }
  97. }

  98. /* BOARD_DEBUG_UART_IRQHandler ISR entry. */
  99. void BOARD_DEBUG_UART_IRQHandler(void)
  100. {
  101.     app_uart_rx_isr_hook();
  102. }

  103. void app_uart_putstr(uint8_t *str)
  104. {
  105.     while ((*str) != '\0')
  106.     {
  107.         app_uart_putchar(*str);
  108.         str++;
  109.     }
  110. }
  111. void app_uart_putchar(uint8_t c)
  112. {
  113.     while ( 0u == (UART_STATUS_TX_EMPTY & UART_GetStatus(BOARD_DEBUG_UART_PORT)) )
  114.     {;}
  115.     UART_PutData(BOARD_DEBUG_UART_PORT, (uint8_t)(c));
  116. }

  117. /* Setup the timer. */
  118. void app_tim_init(void)
  119. {
  120.     /* Set the counter counting step. */
  121.     TIM_Init_Type tim_init;
  122.     tim_init.ClockFreqHz = BOARD_TIM_FREQ;
  123.     tim_init.StepFreqHz = APP_TIM_UPDATE_PERIOD; /* 1s. */
  124.     tim_init.Period = APP_TIM_UPDATE_PERIOD - 1u;
  125.     tim_init.EnablePreloadPeriod = false;
  126.     tim_init.PeriodMode = TIM_PeriodMode_Continuous;
  127.     tim_init.CountMode = TIM_CountMode_Increasing;
  128.     TIM_Init(BOARD_TIM_PORT, &tim_init);

  129.     /* Enable interrupt. */
  130.     NVIC_EnableIRQ(BOARD_TIM_IRQn);
  131.     TIM_EnableInterrupts(BOARD_TIM_PORT, TIM_INT_UPDATE_PERIOD, true);

  132.     /* Start the counter. */
  133.     TIM_Start(BOARD_TIM_PORT);
  134. }

  135. /* TIM_BASIC Period timeout ISR. */
  136. void BOARD_TIM_IRQHandler(void)
  137. {
  138.       static uint32_t i=0;
  139.     uint32_t flags = TIM_GetInterruptStatus(BOARD_TIM_PORT);
  140.     if ( 0u != (flags & TIM_STATUS_UPDATE_PERIOD ) ) /* Check update status. */
  141.     {
  142.       printf ("tim1Cnt = %d\r\n",i++);
  143.             if(i==100) i=0;
  144.     }
  145.     TIM_ClearInterruptStatus(BOARD_TIM_PORT, flags);
  146. }
  147. /* EOF. */
 楼主| gaonaiweng 发表于 2022-12-24 15:28 | 显示全部楼层
本帖最后由 gaonaiweng 于 2022-12-24 15:35 编辑

效果
用串口助手发送 FF FF 06 12 DD,其中06可以控制LED2与LED3点亮,LED1与LED4熄灭,并串口打印LED状态,定时器每秒打印信息也在串口助手中显示

1756763a6ab2ab0e0e.png
 楼主| gaonaiweng 发表于 2022-12-24 15:35 | 显示全部楼层
 楼主| gaonaiweng 发表于 2022-12-24 15:36 | 显示全部楼层
结尾

MM32F5277E9P功能强大,本作只是小试牛刀,最近也一直在尝试多种国产芯片的测试与应用,后续可能测试在语音处理与BLDC电机上的应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

811

帖子

3

粉丝
快速回复 返回顶部 返回列表