一整天,uCGUI移植 道路是曲折的前途是光明的。
代码还没整理好
参考这个文章,只能参考 你要真安上边的来,还是有问题的:
http://www.cnblogs.com/codehxh/archive/2011/07/27/2117659.html
有几个地方我改了,学老王先卖个关子。俗话说:自己琢磨出来的东西才是好东西
早上爬起来就弄这个,差不多的时候出现问题搞不定。
晚上唱了几个歌,换换脑子,回来就找到问题了。。嘿嘿 很简单一个问题


72楼
一天半的时间,移植uCGUI到前天移植好的uCOS上。其中坎坷真是难以言表啊!
我用的是ucgui.com网站下载的3.90的源码版。一天半的时间移植成功。
回想下,其实也不难。只要你C语言功底和编程功底够厉害,不难的。
这两天只移植了,还不知道怎么用。下面是移植心得供拍砖:
1、找参考
我在博客园找到一篇文章,安富莱的人写的。前面讲的挺好的,到了关键点就拉稀了。害得我多条了一下午
2、找文件包含关系
UCGUI里边包含了好多LCD驱动芯片的驱动。在文件LCDConf.h里边,一根据需要自己选择。
#define LCD_CONTROLLER 1375
这个是用来选择LCD驱动芯片的,可以用UCGUI自己带的,如果没有比如我们的SSD1289,只能自己写了。
这个选择也有一个文件依赖关系的,不像安富莱那人说的要包含那个LCDWin.h文件,这个文件是可以改的。不想说怎么依赖了,谁遇到了仔细找找也是一种提高。
3、精简再精简。再出问题在哪里之后再加进去
调试就是要找到最关键的地方,去掉干扰
4、坐的时间长了,要换换脑子。
我昨天是指做不下去了,跟朋友唱歌去了,回来就发现了问题了。。。
一味地靠时间堆是不行的,要换换脑子换换思路。
两个最牛的飞线,证明是我的。高清视频在等老王 压缩视频正在传优库


视频在这里 链接
我用的是ucgui.com网站下载的3.90的源码版。一天半的时间移植成功。
回想下,其实也不难。只要你C语言功底和编程功底够厉害,不难的。
这两天只移植了,还不知道怎么用。下面是移植心得供拍砖:
1、找参考
我在博客园找到一篇文章,安富莱的人写的。前面讲的挺好的,到了关键点就拉稀了。害得我多条了一下午
2、找文件包含关系
UCGUI里边包含了好多LCD驱动芯片的驱动。在文件LCDConf.h里边,一根据需要自己选择。
#define LCD_CONTROLLER 1375
这个是用来选择LCD驱动芯片的,可以用UCGUI自己带的,如果没有比如我们的SSD1289,只能自己写了。
这个选择也有一个文件依赖关系的,不像安富莱那人说的要包含那个LCDWin.h文件,这个文件是可以改的。不想说怎么依赖了,谁遇到了仔细找找也是一种提高。
3、精简再精简。再出问题在哪里之后再加进去
调试就是要找到最关键的地方,去掉干扰
4、坐的时间长了,要换换脑子。
我昨天是指做不下去了,跟朋友唱歌去了,回来就发现了问题了。。。
一味地靠时间堆是不行的,要换换脑子换换思路。
两个最牛的飞线,证明是我的。高清视频在等老王 压缩视频正在传优库


视频在这里 链接

73楼
BUG查找中
LCD初始化之后,EEPROM就不好是了。。。。
我说我的代码没问题啊!
还不小心把SMBUS给初始化了,这样EEPROM悲剧地只读了。
同时,还有一个问题出来了。
前两天一直OS和HUI,添加了太多的代码。
以至于现在编译一次都很费劲。于是决定还是先裸奔吧,至少吧UCGUI干掉先不用。硬件驱动起来,赚点分再弄GUI
LCD初始化之后,EEPROM就不好是了。。。。
我说我的代码没问题啊!
还不小心把SMBUS给初始化了,这样EEPROM悲剧地只读了。
同时,还有一个问题出来了。
前两天一直OS和HUI,添加了太多的代码。
以至于现在编译一次都很费劲。于是决定还是先裸奔吧,至少吧UCGUI干掉先不用。硬件驱动起来,赚点分再弄GUI




77楼
IIC EEPROM 记录开机次数
每次开机时候,从EEPROM中读出一个数值加一之后再写入原地址。
这样可以记录板子复位次数。不是很准,也凑合了。
使用之前需要一个初始化,在EEPROM中要使用的地址上写入00。
我一直难以理解IIC这个总线,代码是抄的。
调试时候的注意事项:
我调试的时候,改变了几次I2C_Ack_Disable/Enable这个东西。
当改成ENABLE的时候,CMU会一直等待ACK。可能是24C02 EEPROM把哪个线拉底了,CMU一直无法获取总线的控制权。复位的时候,24C02不会自动复位。
之后,即使你烧写进去对的程序的时候也读不出来数据。
板子断电再上电,可以解决这个问题。
IIC初始化代码:
//时钟&引脚初始化
void EEPROM_LowLevel_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/*!<I2C_SCL_GPIO_CLK, I2C_SDA_GPIO_CLK Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //SMB、SCL、SDA都在GPIOB上
/*!< Configure SCL(PB6) & SDA(PB7)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//IIC初始化
void EEPROM_Init()
{
I2C_InitTypeDef I2C_InitStructure;
EEPROM_LowLevel_Init();
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
}
至于别的读写,我还不是很理解 就不贴出来找抽了
惯例,图:
每次开机时候,从EEPROM中读出一个数值加一之后再写入原地址。
这样可以记录板子复位次数。不是很准,也凑合了。
使用之前需要一个初始化,在EEPROM中要使用的地址上写入00。
我一直难以理解IIC这个总线,代码是抄的。
调试时候的注意事项:
我调试的时候,改变了几次I2C_Ack_Disable/Enable这个东西。
当改成ENABLE的时候,CMU会一直等待ACK。可能是24C02 EEPROM把哪个线拉底了,CMU一直无法获取总线的控制权。复位的时候,24C02不会自动复位。
之后,即使你烧写进去对的程序的时候也读不出来数据。
板子断电再上电,可以解决这个问题。
IIC初始化代码:
//时钟&引脚初始化
void EEPROM_LowLevel_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
/*!< I2C Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
/*!<I2C_SCL_GPIO_CLK, I2C_SDA_GPIO_CLK Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //SMB、SCL、SDA都在GPIOB上
/*!< Configure SCL(PB6) & SDA(PB7)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//IIC初始化
void EEPROM_Init()
{
I2C_InitTypeDef I2C_InitStructure;
EEPROM_LowLevel_Init();
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Disable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 100000;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1,ENABLE);
}
至于别的读写,我还不是很理解 就不贴出来找抽了
惯例,图:


78楼
ADC1采集引脚电压
晚上玩ADC。DMA方式读取引脚电压。
DMA配置如下:
//外设基地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
//数据存储地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
//数据方向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//缓存大小
DMA_InitStructure.DMA_BufferSize = 1;
//外设地址增量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//DMA_PeripheralInc_Disable;
//数据地址增量
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
//外设数据宽度
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
//存储数据宽度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//循环采集模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//高优先级
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//内存到内存
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
ADC配置如下:
//独立模式
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//连续扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//外部触发模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//数据对齐方式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
//通道号
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel11 configuration */
//规则转换
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
由于没有0~3.3V之间的电压,只能用地线和3.3V电源替代了:
接地时候读出数据为0,接3.3电源时读出0X0FFF.不接基本都在乱跳。
图如下:
晚上玩ADC。DMA方式读取引脚电压。
DMA配置如下:
//外设基地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
//数据存储地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;
//数据方向
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//缓存大小
DMA_InitStructure.DMA_BufferSize = 1;
//外设地址增量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//DMA_PeripheralInc_Disable;
//数据地址增量
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
//外设数据宽度
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
//存储数据宽度
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
//循环采集模式
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
//高优先级
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
//内存到内存
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
ADC配置如下:
//独立模式
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//连续扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//外部触发模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
//数据对齐方式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
//通道号
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
/* ADC1 regular channel11 configuration */
//规则转换
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
由于没有0~3.3V之间的电压,只能用地线和3.3V电源替代了:
接地时候读出数据为0,接3.3电源时读出0X0FFF.不接基本都在乱跳。
图如下:

79楼
这里用的fsmc操作,这个函数完全省略。直接lcd-reg=......就可以了。你先了解下fsmc操作。

80楼
软解MP3
1、Helix MP3解码器
Helix MP3是一个开源的MP3解码器。提供对MPEG-1、 MPEG-2和MPEG-2.5 的第3层(Layer 3)支持。它支持可变位速率、恒定位速率,以及立体声和单声道音频格式。有关实现和特性的详细信息,请访问 Helix MP3 解码器网站:https://datatype.helixcommunity.org/Mp3dec。
Helix MP3 解码器的源代码是开源代码,受制于源代码随附文件中描述的许可协议。
就是说咱们研究,就免费了。
可从Helix MP3 解码器网站下载代码:
https://datatype.helixcommunity.org/Mp3dec。
昨天研究一晚上没什么进展。有进展了再分享。
2、音频输出:
使用STM32自带的DAC输出。网上查了下,片子自带的DAC可以驱动耳机,没试过。两个DAC刚好驱动双声道。
3、录音功能实现:
如果板子上的ADC可以实现的话就试试,否则不做。
4、媒体文件读取:
使用SDIO驱动SD卡。板子上有SDIO驱动的SD卡插槽,可作为数据源。
使用FATFS解析文件系统。读取媒体文件。
最新动向:SDIO初始化完成。
SDIO初始化,使用3.5库:
都说3.5库的stm32f10x_sdio.c有问题,至少我今天没碰到:
我使用的几个函数:
SDIO_DeInit,SDIO_Init,SDIO_SetPowerState,SDIO_ClockCmd。。。。。
在初始化之前,发送命令什么的都可以的。
读取Block的时候就遇到了问题。读出的东西全是0,不知道为啥
调用代码:
if(SD_OK == SD_Init())
{
printf("SD卡初始化成功\r\n");
}
if(SD_OK == SD_GetCardInfo(&SDCardInfo1))
{
printf("成功读取SD卡信息 \n");
//cid的内容解析还不会,打印出来信息是错的。但这些信息读出来了
printf("ManufacturerID:%d\r\n",SDCardInfo1.SD_cid.ManufacturerID);
printf("OEM/Application ID:%d\r\n",SDCardInfo1.SD_cid.OEM_AppliID);
printf("Product Revision:%d\r\n",SDCardInfo1.SD_cid.ProdRev);
printf("Product Serial Number:%d\r\n",SDCardInfo1.SD_cid.ProdSN);
printf("Manufacturing Date:%d\r\n",SDCardInfo1.SD_cid.ManufactDate);
}
//这里读出全是0,有点小问题明天解决
SD_ReadBlock(0x00, (u32 *)(&buf[0]), 512);
最后,上图:

SDIO驱动代码
1、Helix MP3解码器
Helix MP3是一个开源的MP3解码器。提供对MPEG-1、 MPEG-2和MPEG-2.5 的第3层(Layer 3)支持。它支持可变位速率、恒定位速率,以及立体声和单声道音频格式。有关实现和特性的详细信息,请访问 Helix MP3 解码器网站:https://datatype.helixcommunity.org/Mp3dec。
Helix MP3 解码器的源代码是开源代码,受制于源代码随附文件中描述的许可协议。
就是说咱们研究,就免费了。
可从Helix MP3 解码器网站下载代码:
https://datatype.helixcommunity.org/Mp3dec。
昨天研究一晚上没什么进展。有进展了再分享。
2、音频输出:
使用STM32自带的DAC输出。网上查了下,片子自带的DAC可以驱动耳机,没试过。两个DAC刚好驱动双声道。
3、录音功能实现:
如果板子上的ADC可以实现的话就试试,否则不做。
4、媒体文件读取:
使用SDIO驱动SD卡。板子上有SDIO驱动的SD卡插槽,可作为数据源。
使用FATFS解析文件系统。读取媒体文件。
最新动向:SDIO初始化完成。
SDIO初始化,使用3.5库:
都说3.5库的stm32f10x_sdio.c有问题,至少我今天没碰到:
我使用的几个函数:
SDIO_DeInit,SDIO_Init,SDIO_SetPowerState,SDIO_ClockCmd。。。。。
在初始化之前,发送命令什么的都可以的。
读取Block的时候就遇到了问题。读出的东西全是0,不知道为啥
调用代码:
if(SD_OK == SD_Init())
{
printf("SD卡初始化成功\r\n");
}
if(SD_OK == SD_GetCardInfo(&SDCardInfo1))
{
printf("成功读取SD卡信息 \n");
//cid的内容解析还不会,打印出来信息是错的。但这些信息读出来了
printf("ManufacturerID:%d\r\n",SDCardInfo1.SD_cid.ManufacturerID);
printf("OEM/Application ID:%d\r\n",SDCardInfo1.SD_cid.OEM_AppliID);
printf("Product Revision:%d\r\n",SDCardInfo1.SD_cid.ProdRev);
printf("Product Serial Number:%d\r\n",SDCardInfo1.SD_cid.ProdSN);
printf("Manufacturing Date:%d\r\n",SDCardInfo1.SD_cid.ManufactDate);
}
//这里读出全是0,有点小问题明天解决
SD_ReadBlock(0x00, (u32 *)(&buf[0]), 512);
最后,上图:

SDIO驱动代码
回复
有奖活动 | |
---|---|
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 |