提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
STC32G是STC新推出的32位单片机,也就是广义的32位的8051单片机。实际上使用的是Intel的C251架构,因此在编译器上KeilC51是编译不了STC32G的工程的,要使用KEILC251。优势的话最大的就是价格了,STC32G12K128目前推广价格在5块钱左右(当前时间哈),LQFP48的封装,128K的Flash,4+8K的RAM,带USB带CAN。这个配置和价格还要啥自行车。而且本身LQFP48的封装,即便是ARM的架构,应用也不会太复杂。因此可能会替代很多低复杂度的32位ARM的场景。另外的话可以从51平台方便的过渡到这个平台,对于51使用者来说十分的友好。
提示:以下是本篇文章正文内容,下面案例可供参考
一、资料准备
STC32G数据手册 CSDN站内下载 STC32G12K128 最小系统原理图 CSDN站内下载 STC32G FreeRTOS例程 CSDN站内下载 KEIL C251 CSDN站内下载 提示:KEIL的注册自理哟~ STC最新下载软件 支持STC32系列 (6.89F以上版本才支持STC32G) CSDN站内下载
二、工程介绍
1.文件架构
STC32G官方给的工程是基于FreeRTOS的,因此之前喜欢裸跑的小伙伴要自学一下FreeRTOS,不过这个也非常的简单上手非常快。 1.1 从上图可以看出,示例工程的文件架构分了六个部分。其中FreeRTOS目录下存放的是FreeRTOS的源码,这里所有的源码文件都包含在里面了,包括不常用的croutine.c,这个有时间具体研究一下,看看有没有用到。一般的小伙伴可以忽略这里,工程肯定是STC的工程师已经帮忙移植好了。直接用就行。 1.2 port目录下就是移植的部分了。代码也针对STC32G或者是C251平台做了适配。
static StackType_t data xPCL;
static StackType_t data xPCH;
static StackType_t data xPCB;
数据声明时候指定RAM存放位置
static void prvPortSetupTimerInterrupt( void )
{
AUXR |= 0x80;
TMOD &= ~0x0f;
TL0 = ( uint8_t )( portRELOAD_VALUE );
TH0 = ( uint8_t )( portRELOAD_VALUE >> 8 );
TR0 = 1;
ET0 = 1;
}
系统节拍定时,这里使用了TIMER0,这样像用户就不能再用TIMER0做其他应用了。这里不像ARM里面直接用SystemTick就可以。好在STC32G的串口不需要再占用串口资源了,不然定时器就有点紧张了。 另外堆栈库使用的是heap_1,FreeRTOS不同的HEAP库在Malloc和Free方面的策略不同,用户要注意一下。不过一般的应用需要使用Malloc和Free的概率也很低,毕竟还是有一定风险,用不好的话容易出错。 1.3 user里面存放的是上层应用代码,其中FreeRTOSConfig.h是FreeRTOS的配置文件,从这个文件里面也能了解很多内容。
#define configUSE_ROMHUGE 0
#define MAIN_Fosc ( 24000000UL )
首先可以看出这个工程所使用的是24M的时钟,置于是内部时钟还是外部时钟还没有研究。但是作者使用的无外部晶振的板子也可以正常运行。所以一般就不纠结了,一般的应用也足够,并且手册里提到过30M的内部晶振并不是很稳定。 另外configUSE_ROMHUGE的选项与用户代码的大小有关,如果用户代码超过了64K,则需要配置为HUGE模式。同时在KEIL里面的选项也需要进行配置,否则应该是编译会出问题。
#define configUSE_MALLOC_FAILED_HOOK 0
另外这个钩子没哟使用,一般任务在分配内存池不足的时候会调用这个钩子函数进行提示,还是比较有点用的,建议打开并配置上钩子函数。 其他没有深入的去看,系统节拍是1ms也是常规的配置。
另外这个目录下的putchar.c是用来做printf重定向的,可以在STC32G_UART.H这个头文件中定义打印的串口是哪个。示例工程里用的是UART2 波特率 115200。
#define PRINTF_SELECT UART2
总结
以上就是今天分享的内容,内容补充中……
|