原子哥提供的实验29提供了ucOS+ucGUI的移植,尽管很好,但是对于像我这样的初学者同时消耗两个内容太难了,本人想一个一个吃掉,先吃ucGUI,可能是原子哥比较忙,没有提供相关移植过程的教程,小弟只能自己琢磨,最后终于搞定,现班门弄斧!
硬件平台:正点原子开发板,软件:ucgui3.98
步骤:
(1)以原子提供的TFT-LCD实验例程为基础,进行ucgui移植;
(2)便于管理,在实验例程的工程中建立ucGUI文件夹,将ucgui3.98中的ucGUI/AntiAlias,ucGUI/ConverMono,ucGUI/ConverColor,ucGUI/Font,ucGUI/Mendev,ucGUI/Widget,ucGUI/WM,ucGUI/Core等目录及内部代码文件复制到实验例程的ucGUI文件夹中,并在projet/management中相应地建立上述工程目录,并将各自所包含的文件添加到工程中。
(3)同样方法,建立Config、ucGUI_X和ucGUI/LCDDriver三个文件夹和相应的三个工程目录,将正点原子例程29中Config中三个文件复制过来,将ucGUI中的GUI_X.c和GUI_X_Touch.c复制过来,将LCDDriver中的ili9320_ucgui.c,ili9320_api.c和ILI93XX.c复制过来,最后仍然要添加到工程中;
(4)删除原工程hardware中lcd驱动文件ILI93XX.c
(5)在flash/config flash tool中的include选项中添加ucGUI/core,Config,ucGUI_X和ucGUI/LCDDriver三个目录路径
(6)最后编译通过,由于ucGUI版本的原因,可能在连接的时候会出现 一个LCD_L0_GetDevFunc变量没有定义,这时只需在ucGUI/Core/LCD_AP.C中屏蔽该变量即可。
正点原子开发板购买淘宝店铺:
http://openedv.taobao.com
正点原子STM32视频资料下载地址:
http://www.openedv.com/posts/list/13334.htm
PB12功能(包含复用功能)为:PB12/SPI2_NSS/I2S2_WS/I2C2_SMBAI/TIM1_BKIN;
PB13功能(包含服用功能)为:PB13/SPI2_SCK/I2S2_CK/TIM1_CH1N。
可是按按键不能进入外部中断服务程序,不知道是什么原因,下面是我的代码,还请知道原因的大哥能够指点一二,谢谢。
代码:
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//外部中断,需要使能AFIO时钟
KEY_Init();//初始化按键对应io模式
//GPIOB.12 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
EXTI_InitStructure.EXTI_Line=EXTI_Line12;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
//GPIOB.13 中断线以及中断初始化配置
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line=EXTI_Line13;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //使能按键所在的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);
}
void EXTI15_10_IRQHandler(void)
{
delay_ms(10); //消抖
if(EXTI_GetITStatus(EXTI_Line12) != RESET)
{
sei();
GPIOD->ODR^=0x04; //led灯1随着按键1的按动亮灭
EXTI_ClearITPendingBit(EXTI_Line12);
}
else if(EXTI_GetITStatus(EXTI_Line13) != RESET)
{
sei();
GPIOD->ODR^=0x08; //led灯2随着按键2的按动亮灭
EXTI_ClearITPendingBit(EXTI_Line13);
}
}
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12| GPIO_Pin_13;//PB12,PB13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB12,PB13设置成输入,默认下拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化PB2,PB3
}
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
EXTIX_Init(); //外部中断初始化
while(1)
{
}
}
一周热门 更多>