本帖最后由 jinyi7016 于 2022-7-13 16:39 编辑
@安小芯
根据原有项目中STM32使用的外设,一一在N32G430上进行实现。
主要有定时器,GPIO,SPI,UART这些外设。
其中的UART,由log功能实现。
由于串口是通过仿真器连接电脑的,可能是驱动的问题,一些串口调试软件存在问题,有时会收不到,使用友善的串口助手就正常了。
一、GPIO+定时器功能
1ms定时,由于period是16位的,定时器的主频应该是64M,所以,这里设置period为64000。
BSTIMClockFrequency=Common_BSTIM_RCC_Initialize(TIM6, RCC_HCLK_DIV4);
Common_TIM_NVIC_Initialize(TIM6_IRQn, ENABLE);
Common_TIM_Base_Initialize(TIM6, 64000, 0);
TIM_Base_Reload_Mode_Set(TIM6, TIM_PSC_RELOAD_MODE_IMMEDIATE);
TIM_Interrupt_Enable(TIM6, TIM_INT_UPDATE);
TIM_On(TIM6);
顺便把GPIO的功能实现一下,在中断函数中闪LED灯
void TIM6_IRQHandler(void)
{
if (TIM_Interrupt_Status_Get(TIM6, TIM_INT_UPDATE) != RESET)
{
TIM_Interrupt_Status_Clear(TIM6, TIM_INT_UPDATE);
/* Pin PC.06 toggling */
//log_info("GPIO_Pin_Toggle!\r\n");
tim_count++;
if(tim_count==1000)
{
tim_count=0;
GPIO_Pin_Toggle(GPIOA, GPIO_PIN_1);
}
}
}
二、SPI
由于SPI的引脚与LED的引脚冲突了,所以在调试的时候,把两个工程整合的时候,数据总是不对。去掉冲突的LED配置与操作就正常了,
使用硬件CS功能时,初始化有时会失败,使用软件CS就可以了。
void spi_init()
{
SPI_I2S_Reset(SPI_MASTER);
/* SPI_MASTER configuration --------------------------------------------------*/
SPI_Initializes_Structure(&SPI_InitStructure);
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;//SPI_DIR_SINGLELINE_TX;//
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
/* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_128;
SPI_InitStructure.FirstBit = SPI_FB_MSB;
SPI_InitStructure.CRCPoly = 7;
SPI_Initializes(SPI_MASTER, &SPI_InitStructure);
SPI_Set_Nss_Level(SPI_MASTER, SPI_NSS_HIGH);
/* Enable SPI_MASTER CRC calculation */
SPI_CRC_Enable(SPI_MASTER);
/* Enable SPI_MASTER */
SPI_ON(SPI_MASTER);
}
void spi_gpio_init(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_Structure_Initialize(&GPIO_InitStructure);
/* Configure master pins: SCK, MISO and MOSI ---------------------------------*/
/* Confugure SCK and MOSI pins as Alternate Function Push Pull */
GPIO_InitStructure.Pin = SPI_MASTER_MOSI_PIN | SPI_MASTER_CLK_PIN | SPI_MASTER_MISO_PIN | SPI_MASTER_NSS_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Slew_Rate = GPIO_SLEW_RATE_FAST;
GPIO_InitStructure.GPIO_Alternate = SPI_MASTER_GPIO_ALTERNATE;
GPIO_Peripheral_Initialize(SPI_MASTER_GPIO, &GPIO_InitStructure);
}
u8 SPI_WriteByte(SPI_Module* SPIx, u8 Byte)
{
/* Wait for SPI_MASTER Tx buffer empty */
while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_TE) == RESET);
/* Send SPI_SLAVE data */
SPI_I2S_Data_Transmit(LCD_SPI, Byte);
/* Wait for SPI_SLAVE data reception */
while (SPI_I2S_Flag_Status_Get(LCD_SPI, SPI_I2S_FLAG_RNE) == RESET);
return SPIx->DAT;
}
驱动了一块12864的屏。
void lcd_init(void)
{
LCD_CS_L();
LCD_CMD_OFF();
SPI_WriteByte(LCD_SPI, 0xAE);
SPI_WriteByte(LCD_SPI, 0xA0);
SPI_WriteByte(LCD_SPI, 0xc8);
SPI_WriteByte(LCD_SPI, 0x40);
SPI_WriteByte(LCD_SPI, 0xa6);
SPI_WriteByte(LCD_SPI, 0xa4);
SPI_WriteByte(LCD_SPI, 0xA2);
SPI_WriteByte(LCD_SPI, 0x2f);
SPI_WriteByte(LCD_SPI, 0x23);
SPI_WriteByte(LCD_SPI, 0x81);
SPI_WriteByte(LCD_SPI, 0x2b);
SPI_WriteByte(LCD_SPI, 0xaf);
LCD_CS_H();
}
效果如下:
总结:
整体上API的使用与STM32的基本上是差不多的,相应的工程移植过来的工作量也并不大。
后期就需要把相应的基本功能移植过来,并在稳定性上进行长时间的测试了。
|