[活动专区] 【N32G430开发板试用】+STM32的替换过程中的外设使用

[复制链接]
881|2
 楼主| jinyi7016 发表于 2022-7-13 16:37 | 显示全部楼层 |阅读模式
本帖最后由 jinyi7016 于 2022-7-13 16:39 编辑


@安小芯
根据原有项目中STM32使用的外设,一一在N32G430上进行实现。
主要有定时器,GPIO,SPI,UART这些外设。
其中的UART,由log功能实现。
由于串口是通过仿真器连接电脑的,可能是驱动的问题,一些串口调试软件存在问题,有时会收不到,使用友善的串口助手就正常了。

屏幕截图 2022-07-13 163621.png

一、GPIO+定时器功能
1ms定时,由于period是16位的,定时器的主频应该是64M,所以,这里设置period为64000。
  1. BSTIMClockFrequency=Common_BSTIM_RCC_Initialize(TIM6, RCC_HCLK_DIV4);
  2.                 Common_TIM_NVIC_Initialize(TIM6_IRQn, ENABLE);
  3.                 Common_TIM_Base_Initialize(TIM6, 64000, 0);
  4.     TIM_Base_Reload_Mode_Set(TIM6, TIM_PSC_RELOAD_MODE_IMMEDIATE);
  5.     TIM_Interrupt_Enable(TIM6, TIM_INT_UPDATE);
  6.     TIM_On(TIM6);
顺便把GPIO的功能实现一下,在中断函数中闪LED灯
  1. void TIM6_IRQHandler(void)
  2. {
  3.         
  4.     if (TIM_Interrupt_Status_Get(TIM6, TIM_INT_UPDATE) != RESET)
  5.     {
  6.         TIM_Interrupt_Status_Clear(TIM6, TIM_INT_UPDATE);

  7.         /* Pin PC.06 toggling */
  8.       
  9.                         //log_info("GPIO_Pin_Toggle!\r\n");
  10.                         tim_count++;
  11.                         if(tim_count==1000)
  12.                         {
  13.                                 tim_count=0;
  14.                                  GPIO_Pin_Toggle(GPIOA, GPIO_PIN_1);
  15.                                 
  16.    
  17.                         }
  18.     }
  19. }
二、SPI
由于SPI的引脚与LED的引脚冲突了,所以在调试的时候,把两个工程整合的时候,数据总是不对。去掉冲突的LED配置与操作就正常了,
使用硬件CS功能时,初始化有时会失败,使用软件CS就可以了。

  1. void spi_init()
  2. {
  3.                 SPI_I2S_Reset(SPI_MASTER);
  4.         
  5.          /* SPI_MASTER configuration --------------------------------------------------*/
  6.     SPI_Initializes_Structure(&SPI_InitStructure);
  7.     SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;//SPI_DIR_SINGLELINE_TX;//
  8.     SPI_InitStructure.SpiMode       = SPI_MODE_MASTER;
  9.     SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
  10.     SPI_InitStructure.CLKPOL        = SPI_CLKPOL_HIGH;
  11.     SPI_InitStructure.CLKPHA        = SPI_CLKPHA_SECOND_EDGE;
  12.     SPI_InitStructure.NSS           = SPI_NSS_SOFT;
  13.     /* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
  14.     SPI_InitStructure.BaudRatePres  = SPI_BR_PRESCALER_128;
  15.     SPI_InitStructure.FirstBit      = SPI_FB_MSB;
  16.     SPI_InitStructure.CRCPoly       = 7;
  17.     SPI_Initializes(SPI_MASTER, &SPI_InitStructure);
  18.     SPI_Set_Nss_Level(SPI_MASTER, SPI_NSS_HIGH);
  19.         
  20.                 /* Enable SPI_MASTER CRC calculation */
  21.     SPI_CRC_Enable(SPI_MASTER);
  22.         
  23.         /* Enable SPI_MASTER */
  24.     SPI_ON(SPI_MASTER);
  25.         
  26. }
  27. void spi_gpio_init(void)
  28. {                              
  29.     GPIO_InitType GPIO_InitStructure;

  30.     GPIO_Structure_Initialize(&GPIO_InitStructure);
  31.     /* Configure master pins: SCK, MISO and MOSI ---------------------------------*/
  32.     /* Confugure SCK and MOSI pins as Alternate Function Push Pull */
  33.     GPIO_InitStructure.Pin        = SPI_MASTER_MOSI_PIN | SPI_MASTER_CLK_PIN | SPI_MASTER_MISO_PIN | SPI_MASTER_NSS_PIN;
  34.     GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
  35.     GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
  36.     GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_ALTERNATE;
  37.     GPIO_Peripheral_Initialize(SPI_MASTER_GPIO, &GPIO_InitStructure);

  38. }
  39. u8 SPI_WriteByte(SPI_Module* SPIx, u8 Byte)
  40. {
  41.     /* Wait for SPI_MASTER Tx buffer empty */
  42.     while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_TE) == RESET);
  43.    
  44.     /* Send SPI_SLAVE data */
  45.     SPI_I2S_Data_Transmit(LCD_SPI, Byte);
  46.    
  47.     /* Wait for SPI_SLAVE data reception */
  48.     while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_RNE) == RESET);
  49.    
  50.     return SPIx->DAT;

  51. }
驱动了一块12864的屏。
  1. void lcd_init(void)
  2. {
  3.         LCD_CS_L();
  4.         LCD_CMD_OFF();
  5.         
  6.         SPI_WriteByte(LCD_SPI, 0xAE);
  7.         SPI_WriteByte(LCD_SPI, 0xA0);
  8.         SPI_WriteByte(LCD_SPI, 0xc8);
  9.         SPI_WriteByte(LCD_SPI, 0x40);
  10.         SPI_WriteByte(LCD_SPI, 0xa6);
  11.         SPI_WriteByte(LCD_SPI, 0xa4);
  12.         SPI_WriteByte(LCD_SPI, 0xA2);
  13.         SPI_WriteByte(LCD_SPI, 0x2f);
  14.         SPI_WriteByte(LCD_SPI, 0x23);
  15.         SPI_WriteByte(LCD_SPI, 0x81);
  16.         SPI_WriteByte(LCD_SPI, 0x2b);
  17.         SPI_WriteByte(LCD_SPI, 0xaf);
  18.         
  19.         
  20.         
  21.         LCD_CS_H();
  22.         
  23. }
效果如下:

微信图片_20220713162959.jpg

总结:
整体上API的使用与STM32的基本上是差不多的,相应的工程移植过来的工作量也并不大。
后期就需要把相应的基本功能移植过来,并在稳定性上进行长时间的测试了。






  
huquanz711 发表于 2022-7-13 18:21 来自手机 | 显示全部楼层
替换还是很容易嘛!
qiu4466 发表于 2022-7-15 08:18 | 显示全部楼层
没有试过,应该还可以吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1414

帖子

12

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