[N32G43x] 【N32G43XCL-STB_V1.0】+开箱及DEMO程序搭建

[复制链接]
 楼主| qjp1988113 发表于 2021-12-21 09:41 | 显示全部楼层 |阅读模式
N32G43XCL-STB_V1.0板子昨天就收到了,今天才有时间来开箱~
上图片:
Z1.jpg
Z2.jpg
Z3.jpg
Z4.jpg
中规中矩的一个48PIN的最小系统板,送线及加塑料螺丝,好评~
我之前没接触过国民的MCU,乘这个机会,也尝试一把,看看性能到底如何~
我们先看官方对N32G435XX系列MCU的介绍:
Z6.png
除了多了电容触控,其他外设也没什么突出的。
BSP风格类似ST标准库的风格,也容易上手~
板载LED,KEY和CMSIS DAP下载电路,更是一目了然~
下面开始搭建程序:
1、按照MDK PACK支持包。
Z8.png
2、拷贝必要文件,重新组合成一个DEMO工程:
Z7.png
因为采用M4的内核,所以支持位带操作及SYSTICK定时器:
我们新建我们3个核心文件:
sys.h

  1. //位带操作,实现51类似的GPIO控制功能
  2. //具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).M4同M3类似,只是寄存器地址变了.
  3. //IO口操作宏定义
  4. #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
  5. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
  6. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
  7. //IO口地址映射
  8. #define GPIOA_ODR_Addr    (GPIOA_BASE+20) //0x40020014
  9. #define GPIOB_ODR_Addr    (GPIOB_BASE+20) //0x40020414
  10. #define GPIOC_ODR_Addr    (GPIOC_BASE+20) //0x40020814
  11. #define GPIOD_ODR_Addr    (GPIOD_BASE+20) //0x40020C14
  12. #define GPIOE_ODR_Addr    (GPIOE_BASE+20) //0x40021014
  13. #define GPIOF_ODR_Addr    (GPIOF_BASE+20) //0x40021414   
  14. #define GPIOG_ODR_Addr    (GPIOG_BASE+20) //0x40021814   
  15. #define GPIOH_ODR_Addr    (GPIOH_BASE+20) //0x40021C14   
  16. #define GPIOI_ODR_Addr    (GPIOI_BASE+20) //0x40022014     

  17. #define GPIOA_IDR_Addr    (GPIOA_BASE+16) //0x40020010
  18. #define GPIOB_IDR_Addr    (GPIOB_BASE+16) //0x40020410
  19. #define GPIOC_IDR_Addr    (GPIOC_BASE+16) //0x40020810
  20. #define GPIOD_IDR_Addr    (GPIOD_BASE+16) //0x40020C10
  21. #define GPIOE_IDR_Addr    (GPIOE_BASE+16) //0x40021010
  22. #define GPIOF_IDR_Addr    (GPIOF_BASE+16) //0x40021410
  23. #define GPIOG_IDR_Addr    (GPIOG_BASE+16) //0x40021810
  24. #define GPIOH_IDR_Addr    (GPIOH_BASE+16) //0x40021C10
  25. #define GPIOI_IDR_Addr    (GPIOI_BASE+16) //0x40022010

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

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

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

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

  36. #define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出
  37. #define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入
delay.c的一些延时函数:
  1. void delay_us(u32 nus)
  2. {               
  3.         u32 temp;                     
  4.         SysTick->LOAD=nus*fac_us;                                 //时间加载                           
  5.         SysTick->VAL=0x00;                                        //清空计数器
  6.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数          
  7.         do
  8.         {
  9.                 temp=SysTick->CTRL;
  10.         }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
  11.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
  12.         SysTick->VAL =0X00;                                       //清空计数器
  13. }
  14. //延时nms
  15. //注意nms的范围
  16. //SysTick->LOAD为24位寄存器,所以,最大延时为:
  17. //nms<=0xffffff*8*1000/SYSCLK
  18. //SYSCLK单位为Hz,nms单位为ms
  19. //对168M条件下,nms<=798ms
  20. void delay_xms(u16 nms)
  21. {                                     
  22.         u32 temp;                  
  23.         SysTick->LOAD=(u32)nms*fac_ms;                        //时间加载(SysTick->LOAD为24bit)
  24.         SysTick->VAL =0x00;                                   //清空计数器
  25.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数
  26.         do
  27.         {
  28.                 temp=SysTick->CTRL;
  29.         }while((temp&0x01)&&!(temp&(1<<16)));        //等待时间到达   
  30.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器
  31.         SysTick->VAL =0X00;                                       //清空计数器                      
  32. }
  33. //延时nms
  34. //nms:0~65535
  35. void delay_ms(u16 nms)
  36. {                  
  37.         u8 repeat=nms/540;                                                //这里用540,是考虑到某些客户可能超频使用,
  38.                                                                                         //比如超频到248M的时候,delay_xms最大只能延时541ms左右了
  39.         u16 remain=nms%540;
  40.         while(repeat)
  41.         {
  42.                 delay_xms(540);
  43.                 repeat--;
  44.         }
  45.         if(remain)delay_xms(remain);
  46. }
debug_usart.c里面设定为调试串口的配置:
  1. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  2. #if 1
  3. #pragma import(__use_no_semihosting)            
  4. //标准库需要的支持函数                 
  5. struct __FILE
  6. {
  7.         int handle;
  8. };

  9. FILE __stdout;      
  10. //定义_sys_exit()以避免使用半主机模式   
  11. void _sys_exit(int x)
  12. {
  13.         x = x;
  14. }
  15. //重定义fputc函数
  16. int fputc(int ch, FILE *f)
  17. {        

  18.   USART_SendData(DBG_USARTx, (uint8_t)ch);
  19.   /* Loop until the end of transmission */
  20.   while (USART_GetFlagStatus(DBG_USARTx, USART_FLAG_TXC) == RESET)
  21.   {
  22.   }
  23.          
  24.         return ch;
  25. }
  26. #endif


  27. #if EN_DBG_USART_RX   //如果使能了接收
  28. //串口1中断服务程序
  29. //注意,读取USARTx->SR能避免莫名其妙的错误          
  30. u8 DBG_USART_RX_BUF[DBG_USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  31. //接收状态
  32. //bit15,        接收完成标志
  33. //bit14,        接收到0x0d
  34. //bit13~0,        接收到的有效字节数目
  35. u16 DBG_USART_RX_STA=0;       //接收状态标记       
  36. #endif

  37. void DBG_UART_Init(u32 bound)
  38. {
  39.     GPIO_InitType GPIO_InitStructure;
  40.     USART_InitType USART_InitStructure;
  41.   
  42. #if EN_DBG_USART_RX
  43.     NVIC_InitType NVIC_InitStructure;
  44. #endif
  45.   
  46.     //GPIO初始化
  47.     GPIO_InitStruct(&GPIO_InitStructure);
  48.   
  49.     DBG_PERIPH_GPIO_APBxClkCmd(DBG_PERIPH_GPIO_AF | DBG_PERIPH_GPIO, ENABLE);
  50.     DBG_PERIPH_APBxClkCmd(DBG_PERIPH, ENABLE);

  51.     GPIO_InitStructure.Pin        = DBG_TX_PIN;
  52.     GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  53.     GPIO_InitStructure.GPIO_Slew_Rate = GPIO_Slew_Rate_High;
  54.                 GPIO_InitStructure.GPIO_Alternate = DBG_TX_GPIO_AF;
  55.     GPIO_InitPeripheral(DBG_GPIO, &GPIO_InitStructure);

  56.     GPIO_InitStructure.Pin       = DBG_RX_PIN;
  57.     GPIO_InitStructure.GPIO_Pull = GPIO_Pull_Up;
  58.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  59.     GPIO_InitStructure.GPIO_Alternate = DBG_RX_GPIO_AF;
  60.     GPIO_InitPeripheral(DBG_GPIO, &GPIO_InitStructure);
  61.    
  62. #if EN_DBG_USART_RX
  63.     //中断优先级配置
  64.     /* Configure the NVIC Preemption Priority Bits */
  65.     //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//在main函数里面统一配置
  66.     /* Enable the USARTy Interrupt */
  67.     NVIC_InitStructure.NVIC_IRQChannel            = DBG_USART_IRQn;
  68.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  69.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  70.     NVIC_InitStructure.NVIC_IRQChannelCmd         = ENABLE;
  71.     NVIC_Init(&NVIC_InitStructure);
  72. #endif   
  73.     //串口配置
  74.     USART_InitStructure.BaudRate            = bound;
  75.     USART_InitStructure.WordLength          = USART_WL_8B;
  76.     USART_InitStructure.StopBits            = USART_STPB_1;
  77.     USART_InitStructure.Parity              = USART_PE_NO;
  78.     USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
  79.     USART_InitStructure.Mode                = USART_MODE_RX |USART_MODE_TX;

  80.     // init uart
  81.     USART_Init(DBG_USARTx, &USART_InitStructure);
  82. #if EN_DBG_USART_RX    //发送中断默认不开启  
  83.     /* Enable USARTy Receive and Transmit interrupts */
  84.     USART_ConfigInt(DBG_USARTx, USART_INT_RXDNE, ENABLE);
  85.     //USART_ConfigInt(DBG_USARTx, USART_INT_TXDE, ENABLE);
  86. #endif     
  87.     // enable uart
  88.     USART_Enable(DBG_USARTx, ENABLE);
  89. }


  90. #if EN_DBG_USART_RX
  91. void DBG_USART_IRQHandler(void)                        //串口1中断服务程序
  92. {
  93.         u8 Res;
  94. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  95.         OSIntEnter();   
  96. #endif
  97.         if(USART_GetIntStatus(DBG_USARTx, USART_INT_RXDNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  98.         {
  99.                 Res =USART_ReceiveData(DBG_USARTx);//(USART1->DR);        //读取接收到的数据
  100.                
  101.                 if((DBG_USART_RX_STA&0x8000)==0)//接收未完成
  102.                 {
  103.                         if(DBG_USART_RX_STA&0x4000)//接收到了0x0d
  104.                         {
  105.                                 if(Res!=0x0a)DBG_USART_RX_STA=0;//接收错误,重新开始
  106.                                 else DBG_USART_RX_STA|=0x8000;        //接收完成了
  107.                         }
  108.                         else //还没收到0X0D
  109.                         {       
  110.                                 if(Res==0x0d)DBG_USART_RX_STA|=0x4000;
  111.                                 else
  112.                                 {
  113.                                         DBG_USART_RX_BUF[DBG_USART_RX_STA&0X3FFF]=Res ;
  114.                                         DBG_USART_RX_STA++;
  115.                                         if(DBG_USART_RX_STA>(DBG_USART_REC_LEN-1))DBG_USART_RX_STA=0;//接收数据错误,重新开始接收          
  116.                                 }                 
  117.                         }
  118.                 }                    
  119.   }
  120. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  121.         OSIntExit();                                                                                           
  122. #endif
  123. }
  124. #endif
除了3个核心文件外,还写了LED的配置:
  1. #ifndef __LED_NEW_H_
  2. #define __LED_NEW_H_

  3. #include "sys.h"


  4. //LED端口定义
  5. #define LED1 PAout(8)          // D1
  6. #define LED2 PBout(4)          // D2       
  7. #define LED3 PBout(5)          // D3       

  8. void LED_Init(void);

  9. #endif

  1. void LED_Init(void)
  2. {

  3.   GPIO_InitType GPIO_InitStructure;

  4.   RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA|RCC_APB2_PERIPH_GPIOB, ENABLE);

  5.   /* Configure the GPIO pin */
  6.   GPIO_InitStruct(&GPIO_InitStructure);
  7.   //PA8
  8.   GPIO_InitStructure.Pin        = GPIO_PIN_8;
  9.   GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
  10.   GPIO_InitStructure.GPIO_Pull    = GPIO_No_Pull;
  11.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  12.   GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
  13.   //PB4 PB5
  14.   GPIO_InitStructure.Pin        = GPIO_PIN_4|GPIO_PIN_5;
  15.   GPIO_InitStructure.GPIO_Current = GPIO_DC_4mA;
  16.   GPIO_InitStructure.GPIO_Pull    = GPIO_No_Pull;
  17.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  18.   GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
  19.   
  20.   //默认LED关闭状态
  21.   LED1=0;
  22.   LED2=0;
  23.   LED3=0;
  24. }


最终我们设定一个任务:将输入的字符,重新输出,并让一个LED闪烁~
  1. int main(void)
  2. {
  3.   u8 t;
  4.         u8 len;       
  5.         u16 times=0;  
  6.   /*SystemInit() function has been called by startup file startup_n32g43x.s*/
  7.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  8.         delay_init(108);                //延时初始化
  9.         DBG_UART_Init(115200);        //串口初始化波特率为115200
  10.         LED_Init();                                  //初始化与LED连接的硬件接口  
  11.         while(1)
  12.         {
  13.                 if(DBG_USART_RX_STA&0x8000)
  14.                 {                                          
  15.                         len=DBG_USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  16.                         printf("\r\n您发送的消息为:\r\n");
  17.                         for(t=0;t<len;t++)
  18.                         {
  19.                                 USART_SendData(DBG_USARTx, DBG_USART_RX_BUF[t]);         //向串口1发送数据
  20.                                 while (USART_GetFlagStatus(DBG_USARTx, USART_FLAG_TXC) == RESET);//等待发送结束
  21.                         }
  22.                         printf("\r\n\r\n");//插入换行
  23.                         DBG_USART_RX_STA=0;
  24.                 }else
  25.                 {
  26.                         times++;
  27.                         if(times%5000==0)
  28.                         {
  29.                                 printf("\r\nN32G435CL-DEMOBOARD 串口实验\r\n");
  30.                                 printf("JasonQiu@21ic\r\n\r\n\r\n");
  31.                         }
  32.                         if(times%200==0)printf("请输入数据,以回车键结束\r\n");  
  33.                         if(times%30==0)LED1=!LED1;//闪烁LED,提示系统正在运行.
  34.                         delay_ms(10);   
  35.                 }
  36.         }
  37. }
编译无误后,我们下载,查看串口,我们发送什么,它就会回发回来,且LED闪烁:
N32_串口.png                                                                                                                                                         
好了,开箱及DEMO程序就到这了,谢谢大家观看~


kyzhd 发表于 2021-12-21 17:59 | 显示全部楼层
支持支持,学习来了。
xiaoqi976633690 发表于 2021-12-28 15:50 | 显示全部楼层
SDK哪来的啊,976633690@qq.com 能提供分吗
 楼主| qjp1988113 发表于 2021-12-31 14:09 | 显示全部楼层
xiaoqi976633690 发表于 2021-12-28 15:50
SDK哪来的啊, 能提供分吗

微信群里有啊
weiwei4dk 发表于 2021-12-31 17:10 | 显示全部楼层
谢谢分享
hello、C 发表于 2022-1-7 14:52 来自手机 | 显示全部楼层
谢谢分享,过几天我也来写个**
amina22 发表于 2022-6-1 14:40 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部