标签 STM32 下的文章
 2020-12-19T15:07:15.576681    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     1296 views
CPU:STM32F429IGT6对于其他的stm32芯片或者其他ARM Cortex-M芯片,其实解决方法都相通。建议先完整阅读了本文之后,再对照着你所遇到问题的现象进行调试。1.基础知识在ARM Cortex-M系列处理器中,有若干个系统异常专用于 fault 处理。 CM3 中的 Faults 可分为以下几类:(1).总线 faults;(2).存储器管理 faults;(3).用法 faults;(4).硬 fault;1.1.总线 faults当 AHB 接口上正在传送数据时,如果回复了一个错误信号(error response),则会产生总线faults,产生的场合可以是:(1).取指,通常被称作“预取流产”(prefetch abort);(2).数据读/写,通常被称作“数据流产”(data abort);在 CM3 中,执行如下动作时,如果地址有误,亦会触发总线异常:(1).中断处理起始阶段的堆栈 PUSH 动作。此时若发生总线 fault,则称为“入栈错误”;(2).中断处理收尾阶段的堆栈 POP 动作。此时若发生总线 fault,则称为“出栈错误”;(3).在处理器启动中断服务序列(sequence)后读取向量时。这是一种极度罕见的特殊情况,被归类为硬 fault。总线 fault 状态寄存器(BFSR),地址:0xE000_ED29,BFSR的各个位的定义如下:1.2.存储器管理 faults存储器管理 faults 多与 MPU 有关,其诱因常常是某次访问触犯了 MPU 设置的保护规范。另外,某些非法访问,例如,在不可执行的存储器区域试图取指,也会触发一个 MemManage fault,而且在这种场合下,即使没有 MPU 也会触发 MemMange fault。MemManage faults 的常见诱因如下所示:(1).访问了所有 MPU regions 覆盖范围之外的地址;(2).访问了没有存储器与之对应的空地址;(3).往只读 region 写数据;(4).用户级下访问了只允许在特权级下访问的地址;存储器管理 fault 状态寄存器(MFSR),地址:0xE000_ED28,MFSR的各个位的定义如下:1.3.用法 faults用法 faults 发生的场合可以是:(1).执行了协处理器指令。 Cortex-M3 本身并不支持协处理器,但是通过 fault 异常机制,可以建立一套“软件模拟”的机制,来执行一段程序模拟协处理器的功能,从而可以方便地在其它 Cortex 处理器间移植。(2).执行了未定义的指令。同上一点的道理,亦可以软件模拟未定义指令的功能。(3).尝试进入 ARM 状态。因为 CM3 不支持 ARM 状态,所以用法 fault 会在切换时产生。软件可以利用此机制来测试某处理器是否支持 ARM 状态。(4).无效的中断返回(LR 中包含了无效/错误的值);(5).使用多重加载/存储指令时,地址没有对齐。另外,如果需要严格要求程序的质量,还可以让 CM3 在遇到除数为零的时候,以及遇到未对齐访问的时候也产生用法 fault。在 NVIC 中有两个控制位分别与它们对应。通过设置这两个控制位,就可以激活它们。用法 fault 状态寄存器(UFSR),地址:0xE000_ED2A,UFSR的各个位的定义如下:1.4.硬 fault硬 fault 是上文讨论的总线 fault、存储器管理 fault 以及用法 fault 上访的结果。如果这些 fault 的服务例程无法执行,它们就会成为“硬伤” ——上访( escalation)成硬 fault。另外,在取向量(异常处理时对异常向量表的读取)时产生的总线 fault 也按硬 fault 处理。在 NVIC中有一个硬 fault 状态寄存器(HFSR),它指出产生硬 fault 的原因。如果不是由于取向量造成的,则硬 fault 服务例程必须检查其它的 fault 状态寄存器,以最终决定是谁上访的。硬 fault 状态寄存器(HFSR),地址:0xE000_ED2C,HFSR的各个位的定义如下:2.UsageFault INVPC置1解决过程最近在使用RTOS增加DMA驱动时,在对内存到设备和设备到内存的DMA传输测试时,出现了UsageFault,并且UFSR中的INVPC置1了。最开始,单独测试DMA发送是没有问题的,但是DMA发送和接收一起测试时,就会出现UsageFault(INVPC置1)。这个异常不太好定位出现问题的具体位置,因此就检查DMA驱动,并且逐步调试吧。最终,DMA驱动检查和修改好了,仍然出现UsageFault,实在没法了,还是从为什么会出现UsageFault(INVPC置1)开始分析吧。2.1.出现UsageFault(INVPC置1)的原因如果LR中的EXC_RETURN不是合法的值(合法值见下图,包括企图返回ARM状态),则引起用法fault。如果用法fault被除能,也上访成硬fault。此时,用法Fault状态寄存器(UFSR,地址: 0xE000_ED2A)中的INVPC位(位偏移: 2),或者是INVSTATE位(位偏移: 1)置位。上面就是出现该异常的文字分析了。2.2.UsageFault(INVPC置1)的解决过程因为该异常是异常响应期间才可能出现的异常(<<Cortex-M3权威指南>> 9.8节介绍了下,在9.8.4节进行文字说明),因此,只要在异常或中断的返回处打断点,执行下一步就有可能进入UsageFault异常。(当然了这个方法,是比较笨的,不过在缩小了异常出现的范围之后,可以在每次异常或中断的返回处打断点,然后执行下一步,就有可能进入UsageFault异常)我这里是每次开始DMA测试之后,就进入UsageFault异常,并且我的系统中目前就打开了SysTick,PendSV,DMA1_STREAM5,DMA1_STREAM6,NMI,HardFault,MemFault,BusFault,UsageFault这些异常和中断。因此我在开始DMA测试的时候打一个断点,在程序运行到DMA测试开始的断点处时,再在DMA1_STREAM5,DMA1_STREAM6,NMI,HardFault,MemFault,BusFault,UsageFault这些函数的入口打断点,在PendSV的返回处打断点,SysTick就暂时先不管。然后全力运行,发现每次都会在PendSV的异常返回断点处停留(因为任务切换嘛)总共在PendSV的断点处停留了大概7到8次,就进入到了UsageFault。有了上面步骤的铺垫,先去除中断和异常中的断点,还是先在DMA测试开始处打断点,等运行到DMA测试开始处,再在上述的中断和异常相关位置打断点。接下来我就慢慢的调试,在开始DMA测试之后,全速运行,在退出PendSV异常时,执行单步运行到下一步,重复7到8次,从PendSV就进入了UsageFault,在这7到8次中,我看在退出PendSV时,LR寄存器中的值都是0xFFFFFFFD,是合法的啊,当时仔细一想,有可能是退出异常时硬件再将堆栈中的PC赋值给PC时出问题,导致进入了UsageFault。果不其然,在PenSV退出之前,我查看每个PSP(0xFFFFFFFD:返回线程模式,并使用线程堆栈)对应内存数值,能够正常退出PendSV的寄存器和PSP堆栈内容如下图所示:进入UsageFault异常之前的寄存器和PSP堆栈内容如下图所示:此处堆栈中的内容,明显的0x20003D94堆栈中的PC值是有问题的,我的程序是烧写到flash中的PC地址应该是08xxxxxx,然而现在堆栈中的PC地址是0x20003DA8,这个地址是SRAM中的地址,SRAM存储的数据而不是代码,出现这个问题的原因,猜想一下,应该就是任务堆栈溢出导致,当我增加任务堆栈的大小之后,哈哈,程序正常运行,世界是如此美好。3.调试小结3.1.解决过程小结其实上面的步骤2,是我自己的一个调试解决问题的过程,这里给大家提供一个比较直接的解决方式。在开始运行程序之前,直接在UsageFault异常入口函数中打一个断点,然后全速运行程序,等程序停止在UsageFault异常函数的断点处时,需要注意以下几点:(1).如果LR是合法值,那么根据LR判断退出异常时使用的堆栈,然后在Memory查看窗口中,查看堆栈中R0,R1,R2,R3,R12,LR,PC,xPSR这些寄存器的值,根据这些寄存器的值,判断是否是堆栈溢出导致该异常发生;如果不是堆栈溢出导致该异常发生,那么就要根据PC值,在汇编窗口中跳转到PC值对应的代码处,分析导致异常发生的原因;(2).如果LR不是合法值,就要分析下你的代码中,有哪些地方修改过LR的值,确保修改的值要是合法的。3.2.关于UsageFault 如何才能让INVPC置1(1).在退出异常或中断时,执行BX LR时,LR的值是非法的,此时就会触发UsageFault异常,并且INVPC置1。(2).在退出异常或中断时,执行BX LR时,LR的值是合法的,但是退出异常之后要使用的堆栈中,堆栈里面的PC值是有问题的,此时就有可能触发UsageFault异常,并且INVPC置1。对于上面的两点的模拟其实也比较好做,在PendSV或者其他异常的退出的地方打一个断点,然后手动修改LR或者堆栈中PC的值,就能触发UsageFault异常,并且INVPC置1。这里注意一下,修改堆栈中PC的值,我这里测试时候,设置PC值为其他值可能引起其他的异常,貌似修改PC的值为RAM中数据区的地址才会出现该异常,不太清楚为什么会这样,可能是数据区是没有执行代码的权限,因此出异常吧,不太确定,有知道的朋友,欢迎留言讲解。当然了,博主的知识水平有限,对于异常的一些说明可能会有误,如果有误,欢迎指正,谢谢!
ARM嵌入式STM32 阅读全文»
 2020-12-12T20:04:13.391109    |      嵌入式学习    |     AilsonJack    |     暂无评论    |     1129 views
CPU:STM32F429IGT6对于其他的stm32芯片或者其他ARM芯片,其实解决方法都相通,主要就是先修改启动方式,再去更改flash或者ram中的程序。1.问题出现原因最近在调试一个程序时,始终调试不通,没办法了,就想着参考网上的例程来看看,结果下载的stm32工程可能和板子的硬件不太一样导致stm32 flash读写保护,此后使用JLink再也无法连接上stm32了,Keil中也没办法识别出设备:2.解决方法首先,修改stm32的启动方式,我的板子默认设置的是从内部flash启动,这里要解决stm32的读写保护就不能选择从内部flash启动了。修改启动方式为:从系统存储器启动(也就是BOOT0接VCC,BOOT1接GND),下图是stm32f429对应的启动方式配置表:然后重新给板子上电,打开一个好的工程(能够在板子上正常运行的程序),此时Keil能够识别出设备了,然后重新下载程序到板子就OK了,程序下载完成之后,切换启动方式到原来的启动方式即可。
嵌入式STM32JLink 阅读全文»
 2015-04-01T17:59:42.643372    |      STM32    |     AilsonJack    |     暂无评论    |     2007 views
步进电机是一种将电脉冲信号转化为角位移的执行机构。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。使得在速度、位置等控制领域用进电机来控制变的非常的简单。步进电机的特点:步进电机必须加驱动才可以运转,驱动信号必须为脉冲信号,没有脉冲的时候,步进电机静止,如果加入适当的脉冲信号,就会以一定的角度(称为角)转动。转动的速度和脉冲的频率成正比。如果想改变步进电机的转动方向,只需要改变给定步进电机的脉冲顺序即可。上面是关于步进电机的一些基础知识,今天我要给大家讲讲如何利用STM32来驱动步进电机28BYJ。虽然网上有许多的关于28BYJ的驱动程序,不过大多是用51实现的,我现在正好要用到28BYJ,而且驱动也写好了,因此在这里就分享出来用STM32驱动28BYJ的完整程序,方便大家学习使用。在开始讲解之前,先说明一下,我使用的是STM32的库函数,开发工具是Keil,大家如果还不清楚如何在Keil下搭建STM32的库函数工程,那么可以参考我的博文:Keil下建立STM32库函数工程。  这里是我的驱动28BYJ步进电机的完整的Keil工程,有需要的可以下载看看。文件:点此下载  密码:i2gg。这里对于28BYJ的一些细节的东西,我就不讲太多,有想了解更详细信息的,可以参看28BYJ的手册。我在这儿只说一些大家关心的问题。我驱动28BYJ采用的是双相八拍(A-AB-B-BC-C-CD-D-DA),一个循环使转子转动5.625/8度,那么要想使转子转过一圈,就要让这个循环512次。由于STM32的IO口输出信号不足以驱动28BYJ,因此我使用了ULN2003对IO口信号进行放大,然后再连接到步进电机的相应接口上。这里是我使用的引脚定义:IN1:PB3 IN2:PB2 IN3:PB1 IN4:PB0,下面是连接的电路图:下图是四相八拍逆时针方向的一个相序图:我在程序中定义的正反转脉冲数组:u8 cw[8]={0X09,0X01,0X03,0X02,0X06,0X04,0X0C,0X08};//双相八拍正转(顺时针)u8 ccw[8]={0X08,0X0C,0X04,0X06,0X02,0X03,0X01,0X09};//双相八拍反转(逆时针)这个数组最终体现在PB口的低4位,从上述数组中挑一个值讲讲,其余的类似。ccw[0]=0X08,即二进制的0000 1000,也即PB3 PB2 PB1 PB0 – > 1000,对应的是PB3:橙 PB2:黄 PB1:粉 PB0:蓝,对应结果和上图的第二列(序号1)一致,其余的列依此类推。要想步进电机转动的方向反向,那么就让其脉冲反向即可,这也就是ccw与cw的关系啦。理解了这个之后,剩下的大家看看我的程序就明白了。我的程序如下:motor.h:motor.c:main.c:将程序下载到板子上,接好步进电机与STM32的引脚连接,用两个按键或者直接将按键输入口接一下地,是不是看到步进电机动起来了。注:我这个驱动在我自己做的STM32小系统上能跑起来,但是在我买的开发板上貌似有点问题,而且总感觉STM32驱动步进电机的力不大,应该是IO口输出能力的问题,但是想想自己加了个驱动板,按理说,应该不会出现驱动力不足这个现象,有知道怎么回事的朋友可以交流一下。只想说,知识的世界真的很大,怎么学都有学的。
ARMSTM32嵌入式 阅读全文»
 2015-03-22T17:07:49.298401    |      STM32    |     AilsonJack    |     暂无评论    |     1344 views
相信大家使用STM32或者其他芯片的时候,绝大部分时间都是在写裸机程序,不过偶尔会写一些带系统的程序,那么问题来了,这个系统怎么选,又怎么移植呢?今天我给大家讲讲如何移植μCOS-II这个嵌入式系统到STM32下工作,为什么选μCOS-II,因为目前对它比较熟的嘛,而且也适合使用在像STM32这种处理器上。下面就是移植的过程,有图哟。关于移植过程中的一些基础知识,我想大家应该知道上网搜索学习吧。  在移植之前,先下载要用到的μCOS-II的官方移植版本。地址:点此下载 密码:euom。1、首先在Keil下建立STM32库函数工程如果还不会在Keil下建立STM32库函数工程,或者记不清了,可以参考我的博文:Keil下建立STM32库函数工程,这里有详细的说明,也是带图教程哦。2、在工程下,建立存放系统文件的目录在搭建好的工程下,建立一个UCOS-II的文件夹,然后在该文件夹下,再新建两个文件夹:SRC、PORT,效果如下:3、拷贝源码的相关文件到相应的目录注:UCOS-II\SRC下的代码是 ucosii 中无需修改部分,UCOS-II\PORT下的代码是移植时需要修改的。(1)、把Micrium\Software\uCOS-II\Source下的文件拷贝至Test\UCOS-II\SRC:(2)、把Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\IAR下的文件拷贝至 Test\UCOS-II\PORT,把Micrium\Software\EvalBoards\ST\STM32F103ZE-SK\IAR\OS-Probe-LCD下的os_cfg.h文件拷贝到Test\UCOS-II\PORT文件夹下:4、配置Keil工程(1)、在Keil下建立如下组,然后添加对应文件到组下:(2)、添加相应的头文件路径:5、修改移植时需要修改的文件(1)、os_cpu.h:注释掉os_cpu.h文件中下面的这三个函数:void OS_CPU_SysTickHandler(void); void OS_CPU_SysTickInit(void); INT32U OS_CPU_SysTickClkFreq(void);(2)、os_cpu_c.c:把下面这些宏定义也注释掉,把 OS_CPU_SysTickHandler(), OS_CPU_SysTickInit()也注释掉:(3)、os_cpu_a.asm:PUBLIC  OS_CPU_SR_Save  ; Functions declared in this filePUBLIC  OS_CPU_SR_RestorePUBLIC  OSStartHighRdyPUBLIC  OSCtxSwPUBLIC  OSIntCtxSwPUBLIC  OS_CPU_PendSVHandler将以上的PUBLIC改为EXPORT,如下图:将RSEG CODE:CODE:NOROOT(2)修改为:;RSEG CODE:CODE:NOROOT(2)AREA |.text|, CODE, READONLY, ALIGN=2THUMBREQUIRE8PRESERVE8如下图:(4)、os_dbg.c:将该文件中的#define  OS_COMPILER_OPT  __root修改为:#define  OS_COMPILER_OPT  //__root,修改结果如下:(5)、startup_stm32f10x_hd.s:搜索startup_stm32f10x_hd.s中的PendSV_Handler,然后用OS_CPU_PendSVHandler把所有出现PendSV_Handler的地方替换掉,总共三个地方:(6)、os_cfg.h:对其做如下修改:#define OS_APP_HOOKS_EN 0#define OS_DEBUG_EN 0#define OS_EVENT_MULTI_EN 0#define OS_SCHED_LOCK_EN 0#define OS_TICK_STEP_EN 0#define OS_TASK_CHANGE_PRIO_EN 0#define OS_TASK_QUERY_EN 0#define OS_TASK_STAT_EN 0#define OS_TASK_STAT_STK_CHK_EN 0#define OS_TASK_SUSPEND_EN 0#define OS_FLAG_EN 0#define OS_MBOX_EN 0#define OS_TIME_DLY_RESUME_EN 0#define OS_TIME_GET_SET_EN 0#define OS_TIME_TICK_HOOK_EN 0#define OS_TMR_EN  0所做的修改主要是把一些功能给去掉,减少内核大小,也利于调试。等移植完成后,如果需要该功能,再做开启。(7)、stm32f10x_it.c:在该文件引用头文件:#include “ucos_ii.h”在void SysTick_Handler(void) 函数中添加如下代码:OSIntEnter();OSTimeTick();OSIntExit();(8)、ucos_ii.h:注释掉#include <app_cfg.h>:(9)、main.c:在main.c文件中引用ucos_ii.h文件:#include “ucos_ii.h”main.c文件中的代码如下:上述代码创建了两个任务,实现了PC6与PC7的IO口电平切换。仿真结果如下图:至此,在STM32上移植μCOS-II的工作就完成了,接下来,你就可以在这个工程下建立自己的应用程序。
ARMSTM32嵌入式操作系统μCOS 阅读全文»
 2015-03-09T23:22:07.514205    |      STM32    |     AilsonJack    |     暂无评论    |     2800 views
今天给大家讲讲如何在Keil下建立STM32的库函数工程,还不会的博友们,可以来看看,带图教程哦。。。好了,废话不多说,直接进入今天的主题吧。注:在看这个教程之前,先到教程底部把文件下载了,待会要用的哟。1、在桌面上创建Test文件夹,并且在Test文件夹下面创建如下图所示文件注: CORE用来存放核心文件和启动文件;   OBJ是用来存放编译过程文件以及hex文件;   LIB用来存放 ST 官方提供的库函数源码文件;   USER目录除了用来放工程文件外,还用来存放主函数文件main.c,以及其他包括 system_stm32f10x.c等等。2、打开Keil创建工程(1)、点击 Keil的菜单:Project–>New Uvision Project,然后将目录定位到刚才建立的文件夹Test之下的USR目录,工程命名为Test,点击保存:(2)、接下来会出现一个选择Device的界面,就是选择我们的芯片型号,这里我们定位到STMicroelectronics下面的STM32F103ZE(这是我使用的STM32芯片的型号,如果你是其他芯片,请选择对应的型号即可),点击OK按钮:(3)、弹出如下图对话框,我们选择”否”:3、将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面上面已经创建好了一个工程,接下来就需要将将官方的固件库包里的源码文件复制到我们的工程目录文件夹下面。(1)、打开官方固件库包,定位到我们准备好的固件库包的目录 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver下面,将目录下面的src,inc文件夹拷贝到我们刚才建立的LIB文件夹下面。注:src存放的是固件库的.c文件,inc存放的是对应的.h文件。(2)、打开官方固件库包,定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport下面,将文件core_cm3.c和文件core_cm3.h复制到CORE下面去。然后定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm下面,将里面startup_stm32f10x_hd.s文件复制到CORE下面。现在我们的CORE文件夹下面的文件如下:注:对于103系列,主要是用其中3个启动文件(请根据你的芯片容量选择):startup_stm32f10x_ld.s:适用于小容量产品(flash≤32K)startup_stm32f10x_md.s:适用于中等容量产品(64K≤flash≤128K)startup_stm32f10x_hd.s:适用于大容量产品(flash≥256K)(3)、打开官方固件库包,定位到目录STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x下面,将里面的三个文件stm32f10x.h,system_stm32f10x.c,system_stm32f10x.h,复制到我们的USER目录之下。然后将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template下面的 4 个文件main.c,stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h复制到USER目录下面至此我们将需要的固件库相关文件复制到了我们的工程目录下面,下面我们将这些文件加入我们的工程中去。4、工程相关配置(1)、右击Source Group 1,点击Remove Group 'Source Group 1’ and its Files,弹出的对话框选择”是”,如下图:右击Target,点击Add Group,设置其名为USR,如下图:按照上述步骤,添加LIB,CORE,如下图:(2)、下面我们往Group里面添加我们需要的文件右击USR,点击Add Existing Files to Group‘USR'...,在USR目录下,添加所有的.c文件:按照上述操作,将CORE目录下的.c文件与.s文件添加到CORE组中;将LIB目录下的src文件中你用得到的.c文件添加到LIB组中,这里我都添加进去:添加完成后,各个组中的文件如下图:(3)、点击Keil中的图标,然后点击“Output”选项下面的“Select folder for objects...”,然后选择目录为我们上面新建的OBJ目录,并且勾选Create HEX File;接着点击“Listing”选项下面的“Select folder for Listings...”,然后也选择我们上面新建的OBJ目录:(4)、点击Keil中的图标,然后点击c/c++选项.然后点击Include Paths右边的按钮。弹出一个添加path的对话框,然后我们将上面的3个目录添加进去,将”STM32F10X_HD,USE_STDPERIPH_DRIVER”(逗号是英文状态下的逗号)输入到Define 输入框里面,具体如下图:注:你用的是中容量那么STM32F10X_HD修改为STM32F10X_MD,小容量修改为STM32F10X_LD然后点击OK退出。5、编译程序点击下图所示的编译图标,编译程序:上述程序实现了PA0高低电平的切换,其仿真结果如下图:   好了至此,基于Keil的STM32的库函数工程建立完了,大家如果还有什么不明白的,可以留言提问。   这里是我建立的工程及官方库函数,请下载:点此下载
各种芯片ARMSTM32库函数工程建立 阅读全文»
 2015-03-05T11:12:21.740057    |      STM32    |     AilsonJack    |     暂无评论    |     1283 views
注:本文参考了网上相关资料,且通过了本人的尝试。前天刚刚把原子哥的汉字显示实验看完,并且成功的将字库及FATFS的cc936.c文件装到SD卡,昨天又开始研究将UCGUI的汉字库装到SD卡里,为此上网查了许多资料。最开始我用的是论坛里坛友—洋洋kan世界的方法,但是显示出来的汉子不太好,汉子中间有一横线,(可能是自己移植的不太好吧,还有跟字库有很大的关系),因此自己又上网查找相关的解决办法,终于找到了办法,思路和坛友—洋洋kan世界的差不多。这次添加外置字库,最大的问题就是字库的获取上,我的大部分时间也是浪费在这上面的。辛苦了一天的成果,在这里拿出来和大家分享,希望对那些打算将UCGUI的汉字库放在SD卡的朋友们有帮助吧。步骤如下(下面附件有修改好的相关代码文件):1.在GUIType.h文件里添加如下内容:注意:该内容不能放在太靠前的位置,这里我把它放在“/* PROPAA: Proportional, antialiased fonts, 2bpp, SJIS encoding */”的前面。2.将GUI_UC_EncodeNone.c文件里的内容改为如下内容:3.新建文件GUICharPEx.c文件,并且将它加入工程,其内容如下:4.接下来就是新建三个自己的与字体相关的文件分别是:GUI_Font12.c,GUI_Font14.c,GUI_Font16.c,并且将它们加入工程。GUI_Font12.c内容如下:注意:下述代码的字库在SD卡的路径(SD卡卷标为0,且” SYSTEM”文件夹为SD卡根目录下的文件夹 )。至于GUI_Font14.c,GUI_Font16.c,的内容,可查看下面的附件。至此,UCGUI的外置字库添加完成.然后可在main()函数所在的文件里面输入:再在main()函数里面输入如下代码(只是部分代码,相关初始化什么的就自己去弄吧):移植不是随便编的,有图有真相哦 ,其效果图如下:好了,至此,应该就完成了UCGUI添加外置字库到SD卡的全过程。  下面是一些附件: 点此下载注:SYSTEM.rar是SD卡根目录下的字库。直接将其解压,然后将解压得到的文件夹拷贝到SD卡的根目录下即可。
各种芯片ARMSTM32μCGUI字库 阅读全文»
  • 1

  本站信息

目前本站共被浏览 154785 次
目前本站已经运行 3306 天
目前本站共有 165 篇文章
目前本站共有 6 条评论信息
目前本站共有 104 个标签
目前本站共有 0 条留言信息
网站创建时间: 2015年03月01日
最近更新时间: 2023年11月26日
Copyright © 2015~2023  说好一起走   保留所有权利   |  百度统计  蜀ICP备15004292号