[活动专区] 【AT-START-F425测评】+迟来的测试+原子风格代码DEMO

[复制链接]
 楼主| qjp1988113 发表于 2022-4-4 19:08 | 显示全部楼层 |阅读模式
之前整个小区被隔离半个月,板子放在公司了。刚想回去拿,门卫已经不让出去了。这该死的新冠,真是祸害。
上周三我终于出来了,趁着清明小假,在家调调~对于延迟这么久,对AT版主及21IC管理人员深表歉意~
AT-START-F425是个入门的简易小板,CMSISIDAP+最小系统,当然主打的USB功能还是突出了,外加ARDUINO接口,
挂一些外扩模式也是还能玩一玩的~
在网上下载规格书、原理图及BSP。然后开始按照自己的习惯,创建一个DEMOCode~之前用惯了正点原子大哥的代码风格~
我们就按照这个风格,创建一个工程,分离出重要的几个常见函数,并更改例子的框架~
XX0.png
用惯了ST的,国内的MCU代码风格大同小异,还是比较好上手的。
经查看原理图,于CMSISDAP调试器相连的串口是USART1 (PA9 PA10)。
我们对作为调试用的USART1 (PA9 PA10)进行重点修改,让它成为一个通用的串口配置代码:
我们先看引脚复用的位置:
XX.png
usart.h
  1. #include "sys.h"
  2. #include "stdio.h"



  3. /**************** define print uart ******************/
  4. #define PRINT_UART                       USART1
  5. #define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK
  6. #define PRINT_UART_TX_PIN                GPIO_PINS_9
  7. #define PRINT_UART_TX_GPIO               GPIOA
  8. #define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK
  9. #define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9
  10. #define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_1

  11. #define PRINT_UART_RX_PIN                GPIO_PINS_10
  12. #define PRINT_UART_RX_GPIO               GPIOA
  13. #define PRINT_UART_RX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK
  14. #define PRINT_UART_RX_PIN_SOURCE         GPIO_PINS_SOURCE10
  15. #define PRINT_UART_RX_PIN_MUX_NUM        GPIO_MUX_1

  16. #define PRINT_UART_IRQn                  USART1_IRQn
  17. #define PRINT_UART_IRQHandler                                                 USART1_IRQHandler


  18. #define PRINT_UART_REC_LEN                          200          //定义最大接收字节数 200
  19. #define EN_RRINT_UART_RX                                                 1                //使能(1)/禁止(0)串口1接收
  20.                  
  21. extern u8  PRINT_UART_RX_BUF[PRINT_UART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  22. extern u16 PRINT_UART_RX_STA;                         //接收状态标记       


  23. /* printf uart init function */
  24. void uart_print_init(uint32_t baudrate);

  25. #endif
usart.c
  1. #include "usart.h"

  2. u8  PRINT_UART_RX_BUF[PRINT_UART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  3. //接收状态
  4. //bit15,        接收完成标志
  5. //bit14,        接收到0x0d
  6. //bit13~0,        接收到的有效字节数目
  7. u16 PRINT_UART_RX_STA=0;

  8. /* support printf function, usemicrolib is unnecessary */
  9. #if (__ARMCC_VERSION > 6000000)
  10.   __asm (".global __use_no_semihosting\n\t");
  11.   void _sys_exit(int x)
  12.   {
  13.     x = x;
  14.   }
  15.   /* __use_no_semihosting was requested, but _ttywrch was */
  16.   void _ttywrch(int ch)
  17.   {
  18.     ch = ch;
  19.   }
  20.   FILE __stdout;
  21. #else
  22. #ifdef __CC_ARM
  23.   #pragma import(__use_no_semihosting)
  24.   struct __FILE
  25.   {
  26.     int handle;
  27.   };
  28.   FILE __stdout;
  29.   void _sys_exit(int x)
  30.   {
  31.     x = x;
  32.   }
  33.   /* __use_no_semihosting was requested, but _ttywrch was */
  34.   void _ttywrch(int ch)
  35.   {
  36.     ch = ch;
  37.   }
  38. #endif
  39. #endif

  40. #if defined (__GNUC__) && !defined (__clang__)
  41.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  42. #else
  43.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  44. #endif

  45. /**
  46.   * [url=home.php?mod=space&uid=247401]@brief[/url]  retargets the c library printf function to the usart.
  47.   * @param  none
  48.   * @retval none
  49.   */
  50. PUTCHAR_PROTOTYPE
  51. {
  52.   while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  53.   usart_data_transmit(PRINT_UART, ch);
  54.   return ch;
  55. }

  56. /**
  57.   * @brief  initialize uart
  58.   * @param  baudrate: uart baudrate
  59.   * @retval none
  60.   */
  61. void uart_print_init(uint32_t baudrate)
  62. {
  63.   gpio_init_type gpio_init_struct;

  64.   /* enable the uart and gpio clock */
  65.   crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
  66.   crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
  67.         crm_periph_clock_enable(PRINT_UART_RX_GPIO_CRM_CLK, TRUE);
  68.        
  69.   gpio_default_para_init(&gpio_init_struct);

  70.   /* configure the uart tx pin */
  71.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  72.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  73.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  74.   gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;
  75.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  76.   gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);

  77.   gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);
  78.        
  79.         /* configure the uart rx pin */
  80.   gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  81.   gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  82.   gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  83.   gpio_init_struct.gpio_pins = PRINT_UART_RX_PIN;
  84.   gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  85.   gpio_init(PRINT_UART_RX_GPIO, &gpio_init_struct);

  86.   gpio_pin_mux_config(PRINT_UART_RX_GPIO, PRINT_UART_RX_PIN_SOURCE, PRINT_UART_RX_PIN_MUX_NUM);

  87.   /* configure uart param */
  88.   usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
  89.         usart_parity_selection_config(PRINT_UART, USART_PARITY_NONE);
  90.   usart_transmitter_enable(PRINT_UART, TRUE);
  91.         usart_receiver_enable(PRINT_UART, TRUE);
  92.   usart_enable(PRINT_UART, TRUE);
  93.        
  94. #if EN_RRINT_UART_RX
  95.         /* config usart2 and usart1 nvic interrupt */
  96.   nvic_irq_enable(PRINT_UART_IRQn, 0, 0);
  97.         usart_interrupt_enable(PRINT_UART, USART_RDBF_INT, TRUE);//enable receiver interrupt
  98. //        usart_interrupt_enable(PRINT_UART, USART_TDBE_INT, TRUE);//enable transmitter interrupt
  99. #endif       
  100. }



  101. void PRINT_UART_IRQHandler(void)
  102. {
  103.         u8 Res;
  104.         //
  105.   if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  106.   {
  107.     /* read one byte from the receive data register */
  108.     Res= usart_data_receive(PRINT_UART);
  109.                 if((PRINT_UART_RX_STA&0x8000)==0)//接收未完成
  110.                 {
  111.                         if(PRINT_UART_RX_STA&0x4000)//接收到了0x0d
  112.                         {
  113.                                 if(Res!=0x0a)PRINT_UART_RX_STA=0;//接收错误,重新开始
  114.                                 else PRINT_UART_RX_STA|=0x8000;        //接收完成了
  115.                         }
  116.                         else //还没收到0X0D
  117.                         {       
  118.                                 if(Res==0x0d)PRINT_UART_RX_STA|=0x4000;
  119.                                 else
  120.                                 {
  121.                                         PRINT_UART_RX_BUF[PRINT_UART_RX_STA&0X3FFF]=Res ;
  122.                                         PRINT_UART_RX_STA++;
  123.                                         if(PRINT_UART_RX_STA>(PRINT_UART_REC_LEN-1))PRINT_UART_RX_STA=0;//接收数据错误,重新开始接收          
  124.                                 }                 
  125.                         }
  126.                 }
  127.   }

  128. //  if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
  129. //  {

  130. //  }
  131. }

配置不同串口,尽仅需修改头文件即可~
main函数里面调用:
  1.   system_clock_config();
  2.         nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);
  3.         delay_init();
  4.         uart_print_init(115200);
  5.   LED_Init();

  6.   while(1)
  7.   {
  8.                 if(PRINT_UART_RX_STA&0x8000)
  9.                 {                                          
  10.                         len=PRINT_UART_RX_STA&0x3fff;//得到此次接收到的数据长度
  11.                         printf("\r\n您发送的消息为:\r\n");
  12.                         for(t=0;t<len;t++)
  13.                         {   
  14.                                 while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);//等待发送结束                               
  15.                                 usart_data_transmit(PRINT_UART, PRINT_UART_RX_BUF[t]);//向串口1发送数据
  16.                         }
  17.                         printf("\r\n\r\n");//插入换行
  18.                         PRINT_UART_RX_STA=0;
  19.                 }else
  20.                 {
  21.                         times++;
  22.                         if(times%5000==0)
  23.                         {
  24.                                 printf("\r\nAT-STRAT-F425 串口实验\r\n");
  25.                                 printf("qjp1988113@21ic\r\n\r\n\r\n");
  26.                         }
  27.                         if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
  28.                         if(times%30==0){led0_sta=1-led0_sta;LED0(led0_sta);}//闪烁LED,提示系统正在运行.
  29.                         delay_ms(10);   
  30.                 }
  31.   }

调试输出:
xx9.png
其中对于BITBAND 功能的外设的映射失败,无反应,查看半天也未看出问题。
我这里主要对GPIO的输入输出配置。
RM里面的描述:
XX3.png
  1. #define PER_BASE                         0x40000000
  2. #define PER_BITBAND_BASE                 0x42000000

  3. #define BITBAND(addr, bitnum) (PER_BITBAND_BASE + ((addr - PER_BASE) * 32) + ((bitnum) * 4))
  4. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  5. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
  6. //IO口地址映射
  7. #define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
  8. #define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414
  9. #define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814
  10. #define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14
  11. #define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014
  12. #define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414   

  13. #define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010
  14. #define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410
  15. #define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810
  16. #define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10
  17. #define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010
  18. #define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410

  19. //IO口操作,只对单一的IO口!
  20. //确保n的值小于16!
  21. #define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出
  22. #define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入

  23. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出
  24. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入

  25. #define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出
  26. #define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入

  27. #define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出
  28. #define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入

  29. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
  30. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

  31. #define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出
  32. #define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入
实际定义LED0=PCout(2),并调用LED0=1;LED=0;无反应~
哪位大侠不吝赐教~

sparrow054 发表于 2022-4-13 15:21 | 显示全部楼层
代码风格很熟悉
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

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