工程建立
这里以MDK为例,准备工作下载:N32G455对应的PACK包和开发库:
1.首先,新建一个名为 N32Template 的文件夹,减少不必要的麻烦,避免使用中文路径。新建其他文件夹,方便文件归档
2.在该文件夹下新建自定义工程,并正确选择使用的mcu;
3.复制国民提供的资料到文件夹,由于这里使用的库是N32G45x_Library.2.1.0,并没有xfmc相关驱动,所以这里把旧版本的xfmc相关的头文件和源文件复制过去
4.添加启动文件和源文件文件
5.配置头文件包含路径,配置输出文件路径
6.选择编译器
7.新建main.c源文件,简单复制一段例程代码到Main.c:
#include <stdio.h>
#include <stdint.h>
#include "n32g45x.h"
void SetSysClock_HSE_PLL(uint32_t pllmul)
{
__IO uint32_t StartUpCounter = 0, HSEStartUpStatus = 0;
// It is necessary to initialize the RCC peripheral to the reset state.
RCC_DeInit();
// Enable HSE, open external crystal oscillator.
RCC_ConfigHse(RCC_HSE_ENABLE);
// Wait for HSE to be stable.
HSEStartUpStatus = RCC_WaitHseStable();
// Go on until the HSE is stable.
if (HSEStartUpStatus == SUCCESS)
{
//
// Enable flash Prefetch buffer
FLASH_PrefetchBufSet(FLASH_PrefetchBuf_EN);
// 0:HCLK <= 32M
// 1:HCLK <= 64M
// 2:HCLK <= 96M
// 3:HCLK <= 128M
// 4:HCLK <= 144M
FLASH_SetLatency(FLASH_LATENCY_4);
//
// AHB prescaler factor set to 1,HCLK = SYSCLK = 144M
RCC_ConfigHclk(RCC_SYSCLK_DIV1);
// AHB prescaler factor set to 2,PCLK2 = HCLK/2 = 72M
RCC_ConfigPclk2(RCC_HCLK_DIV2);
// AHB prescaler factor set to 4,PCLK1 = HCLK/4 = 36M
RCC_ConfigPclk1(RCC_HCLK_DIV4);
////
// PLLCLK = 8MHz * pllmul
RCC_ConfigPll(RCC_PLL_SRC_HSE_DIV1, pllmul);
////
// Enable PLL
RCC_EnablePll(ENABLE);
// Wait for PLL to be stable.
while (RCC_GetFlagStatus(RCC_FLAG_PLLRD) == RESET)
{
}
RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLLCLK);
// Switch PLL clock to SYSCLK.
RCC_ConfigSysclk(RCC_SYSCLK_SRC_PLLCLK);
// Read the clock switch status bit and make sure pllclk is selected as the system clock.
while (RCC_GetSysclkSrc() != 0x08)
{
}
}
else
{ // If HSE fails to open, the program will come here, where the user can add the error code to handle.
// When HSE fails or breaks down,mcu will automatically set HSI as the system clock.HSI is an internal high speed
// clock of 8MHz.
while (1)
{
}
}
}
int main(void)
{
SetSysClock_HSE_PLL(RCC_PLL_MUL_18); ///配置系统时钟源为外部高速时钟
RCC_ConfigPclk1(RCC_HCLK_DIV4);
while(1)
{
}
}
8.编译一下,出现29个错误,前两条
现在是把N32库里所有的驱动加入了工程,eth在项目中不使用,可以直接从工程中移除ETH相关文件,错误原因是在执行语句后定义局部变量。
这里不移除文件,可以选择勾选 C99模式,后面LVGL也会用到。
另外的27处错误都是相关标识符未定义:
1.打开 n32g45x.h 修改 RESERVE48_IRQn = 48, /!< RESERVE
为 XFMC_IRQn = 48, /!< XFMC global Interrupt 另外,.s启动文件里参考上下文格式修改中断相关定义
2.在n32g45x.h 中添加所有xfmc的相关定义,这里需要从老版本的文件中复制,具体看文件;
3.再次编译,无错误产生。至此步骤,打包为文件1*附件:文件1.rar
TFT测试
项目选择使用的是一块320x240的屏,驱动为ili9341。供应商也有提供测试代码,幸运的是国民提供的demo例程里也有这么一块内容,这里直接CV再做一些修改:
1.写寄存器方式或者添加
#define RCC_AHB_PERIPH_XFMC ((uint32_t)0x00000100)
用RCC_EnableAHBPeriphClk函数使能RCC XFMC外设时钟;
2.添加名为lcd的头文件和源文件,到工程,根据实际工程的LCD连接线使能对应的GPIO的引脚功能,本工程里连线头文件中看见,本文没有实现屏幕亮暗调节,可通过PWM开关背光灯实现
3.启用并配置XFMC,XFMC的映射:
操作LCDNOR 类似操作FLASH、PSRAM,故基地址为0x60000000;和STM32类似,8080接口的LCD命令和数据采用地址线的高低电平实现,即向不同地址写入数据,项目中采用A16,一般逻辑A16地址输出高电平对应地址第16位为一(即 1 << 16),但是FSMC中,数据宽度为8的地址采用[24:0]位地址,宽度16的数据采用[25:1]位地址,最低0位不用,故实际地址需再左移1位,即 1 << 17 = 20000;虽然N32使用XFMC,但实际类似,即:#define XFMC_Addr_ILI9341_CMD ((uint32_t)0x60000000) #define XFMC_Addr_ILI9341_DATA ((uint32_t)0x60020000)
4.相对于复制过来的例程,项目已经删除了很多东西,代码可自行下载查看,这里不再浪费篇幅贴出。
5.LCD测试:
int main(void)
{
SetSysClock_HSE_PLL(RCC_PLL_MUL_18);
RCC_ConfigPclk1(RCC_HCLK_DIV4);
ILI9341_Init();
while(1)
{
ILI9341_Delay(14400000);
lcd_fill(COLOR_YELLOW);
ILI9341_Delay(14400000);
lcd_fill(COLOR_RED);
}
}
6.编译无错误,选择合适的方式下载到MCU。验证LCD是否正常显示,至此打包工程为*附件:文件2.rar