tag 标签: MC3172

相关博文
  • 热度 4
    2023-1-11 12:36
    2258 次阅读|
    0 个评论
    【MC3172】MC3172驱动DS1302时钟设计 前言 距离上一次评测MC3172已经过去一段时间。当时本来打算着手实现MC3172驱动DS1302时钟模块实现电子钟。当时由于疫情以及其他事情。导致没能写出驱动功能。现发布这篇博客将DS1302时钟驱动代码补档。 1实现原理 如何实现配置内核定时器编写延时函数以及根据官方串口例程修改成输出需要的显示轮询打印时间的功能已经在我的上一篇博客“ 原创 【MC3172】基于MC3172串口打印的计时器设计 ”中有提到。如果不会这一部分配置的。感兴趣的也可以参考博客中的配置讲解。里面也有我配置好的代码包可供大家下载使用。 接下来我主要讲解DS1302时钟的驱动原理。 这里我先说一下我的整体思路。因为MC3172这款芯片是新研发的芯片。相对来说驱动一些外设的资料比较少。所以我们在使用芯片写其他功能的时候就需要参考其他资源多的开发板的驱动程序。将其中的细节研究清楚。并把相关代码修改成MC3172可以使用的代码。就是整个配置流程。不过这需要对单片机功能的细节把控清楚。最终才能保证不出现代码错误的情况下。保证原理正确即可调通结果。 这张图是DS1302时钟时序图。我已经将关键电平时间做了相关标注。被标注的时间是我们可以控制的时间。这一部分时间最好在逻辑分析仪下具体观察每一小段电平时间是否严格符合时序图规定。 比如。 Tcc 这一段时间是 1us 。就表示在 SCLK 的上升沿到来之前。我们至少需要在 RST 拉高后延时 1us 的时间。 其他的标注地方的理解也同理。 时序图还有个关键部分。就是数据线IO除了我们发送数据。还需要从DS1302读回数据。这样就涉及到一个IO切换问题(由读转换为写或者写转换为读)。以及如何确定我们稳定读取到了DS1302时钟芯片返回的数据(有可能我们写时序有误而接收不到返回数据。或者我们读数据时给的时间太少。导致数据不稳定没有读取到)。这两个问题至关重要。也是我之前所说的细节问题。不同的单片机实际上我认为差别就在这些小功能的细节上。而MC3172的IO功能。读写功能互斥。启动一个不能启动另一个。就需要我们把读功能打开并关闭写功能。然后去读数据。读完数据后如果需要写。就需要把写功能打开并关闭读功能。相关代码如下 SDA_SET_READ_EN; SDA_SET_WRITE_UEN; for(i = 0; i < 8; i++) //读数据都是先移动再读取 { SCL_L; //时序图上可以看出下降沿后开始数据稳定可以读数据 = 1; delay_us(3); 3) { dat |= 0x80; } SCL_H; delay_us(3); } SDA_SET_WRITE_EN; SDA_SET_READ_UEN; 这里我只贴了部分细节 。通过 SDA_SET_READ_EN ; 宏定义使能读。 SDA_SET_WRITE_EN ; 宏定义使能写 。第二个读数据稳定就体现在了 dat = 1; 这一句后面的延时。这里就是给读取数据的一个时间。因此这里的读取为保证数据稳定。推荐稍长的时间。 5~ 10 us 均可 。 下面贴出 DS 1302 驱动各部分编写的函数 //写一字节函数 void Write_Byte(u8 address) { u8 i; for(i = 0; i < 8; i++) { SCL_L; if(address & 0x01) { SDA_H; } else { SDA_L; } = 1; SCL_H; delay_us(1); } } //指定地址address写数据dat函数 void DS1302_WriteByte(u8 address, u8 dat) { // u8 i; RST_L; // NOP(); SCL_L; // NOP(); RST_H; NOP();NOP();NOP(); NOP();NOP();NOP(); Write_Byte(address); Write_Byte(((dat / 10) << 4) | (dat % 10)); // dat = ((dat / 10) << 4) | (dat % 10); } //指定地址读取数据函数 u8 DS1302_ReadByte(u8 address) { u8 dat, i, dat1, dat2; u16 dat_get = 0; RST_L; // NOP(); SCL_L; // NOP(); RST_H; NOP();NOP();NOP(); NOP();NOP();NOP(); Write_Byte(address); // _nop_();_nop_();_nop_(); // _nop_();_nop_();_nop_(); SDA_SET_READ_EN; SDA_SET_WRITE_UEN; for(i = 0; i < 8; i++) //读数据都是先移动再读取 { SCL_L; //时序图上可以看出下降沿后开始数据稳定可以读数据 = 1; delay_us(3); 3) { dat |= 0x80; } SCL_H; delay_us(3); } SDA_SET_WRITE_EN; SDA_SET_READ_UEN; SDA_L; //为了输出的稳定SDA要置0 // dat = dat - 6; //BCD码减去6得到bcd码de十进制数值下的十六进制表示。 dat1 = dat / 16; dat2 = dat % 16; dat = dat1 * 10 + dat2; return dat; } //DS1302初始化 void DS1302_init() { u8 i, add; add = 0x80; DS1302_WriteByte(0x8E, 0x00); for(i = 0; i < 7; i++) { DS1302_WriteByte(add, init ); add += 2; } DS1302_WriteByte(0x8E, 0x80); } //DS1302时间获取 void DS1302_Get() { u8 i, add; add = 0x81; DS1302_WriteByte(0x8E, 0x00); //清除保护 for(i = 0; i < 3; i++) { time = DS1302_ReadByte(add); //写入时是秒分时往里写读的时候是时分秒外读 add += 2; } DS1302_WriteByte(0x8E, 0x80); } IO 引脚宏定义 #include "../MC3172/MC3172.h" #include "./GPIO_GPCOM_TIMER_Example.c" #define SYS_CORE_CLK_MHZ 48 //PD1 CLK SCL PD3 DAT SDA PD5 RST CE #define SCL_H GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR ,GPIO_PIN1) #define SCL_L GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR ,GPIO_PIN1) #define SDA_H GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR ,GPIO_PIN3) #define SDA_L GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR ,GPIO_PIN3) #define RST_H GPIO_SET_OUTPUT_PIN_TO_1(GPIOD_BASE_ADDR ,GPIO_PIN5) #define RST_L GPIO_SET_OUTPUT_PIN_TO_0(GPIOD_BASE_ADDR ,GPIO_PIN5) #define SDA_SET_READ_EN GPIO_SET_INPUT_EN_VALUE(GPIOD_BASE_ADDR ,GPIO_PIN3,GPIO_SET_ENABLE) //读使能 #define SDA_SET_READ_UEN GPIO_SET_INPUT_EN_VALUE(GPIOD_BASE_ADDR ,GPIO_PIN3,GPIO_SET_DISABLE) //读失能 #define SDA_SET_WRITE_EN GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR ,GPIO_PIN3,GPIO_SET_ENABLE) //写使能 #define SDA_SET_WRITE_UEN GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR ,GPIO_PIN3,GPIO_SET_DISABLE) //写失能 #define SDA_READ_FAST GPIO_GET_INPUT_VALUE_FAST(GPIOD_BASE_ADDR) #define SDA_READ GPIO_GET_INPUT_VALUE_SAFE(GPIOD_BASE_ADDR) //#define SDA_SET_PULLDOWN GPIO_SET_PULL_DOWN_VALUE(GPIOD_BASE_ADDR,GPIO_PIN3,0x00000008) u8 init ; 2主体功能及展示。 主要功能就是在屏幕上显示Real_Time:23:24:13。这样的格式打印的时间。具体内容我将通过视频演示 开发板接线实物图如下所示 PB3是板子TX。接串口模块的RXD。PB2是RX接串口模块的TX。然后PD1到PD3依次接DS1302的时钟线CLK。数据线DAT。复位端RST。 这里由于核心板的电源没有多余排针引出。因此我用了一块废板的共脚排针。通过共脚排针为DS1302供电。 3之后计划做的事。 研究一下这个板子的线程通信方法以及如何像带有中断的单片机一样利用定时器计时。这样之后可以借此移植其他板子的超声波测距函数。这块板子总体来说很不错。我希望大家也多多支持感芯科技。
  • 热度 9
    2022-11-4 00:11
    2039 次阅读|
    0 个评论
    一:第一感受: 优点:板子小巧,功能强大,做工优良 不足:没有led指示灯,有led灯的话调试会方便很多 二:工程环境搭建 直接参考官网资料,很容易就搭建好了工程环境,测试ok,不得不说资料很详细。 三:IO口测试 直接用官方例程进行测试: 由于没有指示灯,所以直接用万用表进行功能测试 1:执行指令 GPIO_SET_OUTPUT_PIN_INV(gpio_sel,(GPIO_PIN7)); 量PA7脚电压为1.6V 2:执行指令 GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN7)); 量PA7脚电压为3.2V 3:执行指令 GPIO_SET_OUTPUT_PIN_TO_0(gpio_sel,(GPIO_PIN7)); 量PA7脚电压为0V 三:串口功能测试 同样直接用官方例程进行测试不用做任何修改:接串口4到usb转串口模块上:直接测试收发如下: 四:串口printf功能移植 参考大神的方法:链接如下: 五:HAL库移植测试 参考游乐场大神的程序,链接如下: 最开始测试,串口波特率不对,修改如下图所示分频后解决 然后还遇到的问题是打印中文信息乱码,如下图所示: 经过咨询大神,发现是编码不一致导致,HAL库中使用的是UTF8字符编码,修改后OK如下图所示: 目前移植的程序还存在申请锁超时问题,待进一步解决。 总结:MC3172单片机上手容易,多线程操作给力,串口丰富可以任意分配功能强大。
  • 热度 9
    2022-11-2 09:19
    3125 次阅读|
    1 个评论
    前言 mc3172评测前言mc3172是一款32位risc处理器。可以执行64线程同步运行,这款单片机实际上和我以前玩过的一些单片机都有所不同,区别在以下两点,首先mc3172实现了不需要像操作系统线程调度那样的线程操作,通过硬件配置实现了线程操作。其次是mc3172的mdk是基于c++的,而这对于用惯了keil的我来说是个难题,用c习惯的用法在c++里就会绊脚,这里由于本人实力尚浅,没能写出ds1302时钟的程序。这里就简单介绍我编写的基于MC3172串口打印计时器设计,这一功能可以供大家做功能拓展使用,程序链接我会附在文末,大家可以下载交流 1实现原理 对于这款单片机,我觉得板子外设的驱动尚且还不算太难,毕竟有官方的介绍文档,以及论坛一些大佬的代码例程。在我初期研究几天后算是把外设的起步内容研究好,如果要实现计时器,则需要的外设就包括定时器,以及串口进行打印。定时器通过双规则区轮询计数,具体来说就是设定规则区0的起始值和终止值。然后再设定规则区1的起始值和终止值。定时器时钟周期基于系统时钟分频。计数时就是先在规则区0从起始计数到末尾。规则区0计数完成后自动跳转到规则区1的起始处进行计数。如此往复。还是不同于主流单片机的计数功能。可以看下图我详细注释的代码 上面的代码时论坛直接找的例子。基于这个例子我推导出了定时器配置的函数 这个定时器只通过一个CORE_CNT来获取实时计数值。也就是定时器启动后一直运行 这样定时器部分的配置就解决了。接下来就是串口收发部分。这里直接采用了串口的例程。由于官方暂时未适配标准库相关函数(例如sprintf)。我这里一开始也对串口机制不熟悉走了弯路。采用单个字符即写即发。在这个板子上如果快速发送(小于1ms的延时)。基本上在PC上位软件会显示混乱。而在通过for循环字符串整体收发时。就不会出现这样的情况。因此我采用字符串预生成后发送的方法解决了串口收发问题。这一处程序也可以作为大家的串口收发参考例程。下面我把关键部分展示出来 红框标注的内容时串口操作时需要定义的变量。利用一个枚举类型做状态切换。用于将固定发送内容(codechar保存)与自制预处理字符串(sec_str保存)分别发送到电脑上。 下面是串口部分具体实现 2主体功能及展示。 主体实现的功能就是串口打印计时时间。每隔2s显示一次。可以记录时。分。秒三个数据 具体代码已在上述图片中的串口部分展示出。这里就不具体展示。下面给出串口结果 3之后计划做的事。 研究一下这个板子的线程通信方法以及如何像带有中断的单片机一样利用定时器计时。这样之后可以借此移植其他板子的超声波测距函数。 4给官方的建议 关于GPIO的库函数感觉相关函数太少以及描述内容不详细。有些我想写的功能但是引脚按照配置后板子实测效果却和预想不同。比如IO口配置成GPIO输入模式。文档里有写可以配置成上拉和下拉。但是并没有找到下拉相关函数。GPIO相关函数不完善我觉得是我写一些外设驱动的阻碍。希望官方能考量我的意见完善一下GPIO的函数 链接:https://pan.baidu.com/s/1bZz4v0ygTnTwOuDkikHsYQ?pwd=fxzq 提取码:fxzq
  • 热度 3
    2022-10-26 20:37
    1755 次阅读|
    2 个评论
    OLED 屏有多种形式,如单色屏、双色屏及彩色屏;如 0.91 寸、 0.96 寸等;如 I2C 接口、 SPI 接口屏等。 这里使用的是一款 0.96 寸的双色 I2C 接口屏,它与开发板的连接关系为: SDA---PA0 SCL---PA1 定义引脚输出高低电平的语句定义为: #define SCL_high GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN0) #define SCL_low GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN0) #define SDA_high GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,GPIO_PIN1) #define SDA_low GPIO_SET_OUTPUT_PIN_TO_0(GPIOA_BASE_ADDR,GPIO_PIN1) 对 OLED 屏进行初始化的函数为: void OLED_Init(void) { OLED_WR_Byte(0xAE,OLED_CMD); OLED_WR_Byte(0x02,OLED_CMD); OLED_WR_Byte(0x10,OLED_CMD); OLED_WR_Byte(0x40,OLED_CMD); OLED_WR_Byte(0x81,OLED_CMD); OLED_WR_Byte(0xff,OLED_CMD); OLED_WR_Byte(0xA1,OLED_CMD); OLED_WR_Byte(0xC8,OLED_CMD); OLED_WR_Byte(0xA6,OLED_CMD); OLED_WR_Byte(0xA8,OLED_CMD); OLED_WR_Byte(0x3f,OLED_CMD); OLED_WR_Byte(0xD3,OLED_CMD); OLED_WR_Byte(0x00,OLED_CMD); OLED_WR_Byte(0xd5,OLED_CMD); OLED_WR_Byte(0x80,OLED_CMD); OLED_WR_Byte(0xD9,OLED_CMD); OLED_WR_Byte(0xF1,OLED_CMD); OLED_WR_Byte(0xDA,OLED_CMD); OLED_WR_Byte(0x12,OLED_CMD); OLED_WR_Byte(0xDB,OLED_CMD); OLED_WR_Byte(0x40,OLED_CMD); OLED_WR_Byte(0x20,OLED_CMD); OLED_WR_Byte(0x02,OLED_CMD); OLED_WR_Byte(0x8D,OLED_CMD); OLED_WR_Byte(0x14,OLED_CMD); OLED_WR_Byte(0xA4,OLED_CMD); OLED_WR_Byte(0xA6,OLED_CMD); OLED_WR_Byte(0xAF,OLED_CMD); OLED_WR_Byte(0xAF,OLED_CMD); OLED_Clear(); OLED_Set_Pos(0,0); } 在驱动 OLED 屏时,其辅助 I2C 启动与停止的函数如下: void IIC_Start() { SCL_high; SDA_high; SDA_low; SCL_low; } void IIC_Stop() { SCL_low; SDA_low; SCL_high; SDA_high; } 以 GPIO 口模拟 I2C 发送字节数据的函数为: void Write_IIC_Byte(unsigned char IIC_Byte) { unsigned char i; unsigned char m,da; da=IIC_Byte; SCL_low; for(i=0;i<8;i++) { m=da; m=m&0x80; if(m==0x80) { SDA_high; } else { SDA_low; } da=da<<1; SCL_high; SCL_low; } } 实现 OLED 屏清屏的函数为: void OLED_Clear(void) { u8 i,n; for(i=0;i<8;i++) { OLED_WR_Byte(0xb0+i,OLED_CMD); OLED_WR_Byte(0x00,OLED_CMD); OLED_WR_Byte(0x10,OLED_CMD); for(n=0;n<128;n++) OLED_WR_Byte(0,OLED_DATA); } } 实现字符及字符串显示的函数如下: void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size) { unsigned char c=0,i=0; c=chr-' '; Max_Column-1){x=0;y=y+2;} if(Char_Size ==16) { OLED_Set_Pos(x,y); for(i=0;i<8;i++) OLED_WR_Byte(F8X16 ,OLED_DATA); OLED_Set_Pos(x,y+1); for(i=0;i<8;i++) OLED_WR_Byte(F8X16 ,OLED_DATA); } else { OLED_Set_Pos(x,y); for(i=0;i<6;i++) OLED_WR_Byte(F6x8 ,OLED_DATA); } } void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size) { unsigned char j=0; while (chr !='\0') { OLED_ShowChar(x,y,chr ,Char_Size); x+=8; 120){x=0;y+=2;} j++; } } 驱动 OLED 屏显示的程序被放置在行程 0 中,其显示程序为: void thread0_main(void) { //使能了GPIOA的时钟 INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)); //将PA0设置为输出模式 GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN0),GPIO_SET_ENABLE); GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN1),GPIO_SET_ENABLE); OLED_Init(); OLED_Clear(); OLED_ShowString(0,0,"MC3172",16); OLED_ShowString(0,2,"OLED TEST",16); while(1){ } thread_end(); } 经编译与下载,其显示效果如图 所示。 显示效果
  • 热度 11
    2022-10-26 10:48
    2006 次阅读|
    0 个评论
    从今年暑假开始,接触到了freertos的操作系统,打开了多线程世界的大门,正好又碰上了感芯科技这款并行处理器,可以将两者进行对比 这是一款小巧而精致的最小系统板,板子上集成了两路稳压(3.3V,1.8V),48M高速晶振和ch553g芯片,满足芯片的下载,供电以及时钟电路(如果能够在集成一个复位按键和一个电源指示灯就更好了) 1.环境搭建 MC3172使用 国产 的 MounRiver Studio 作为开发工具,从地址: http://www.mounriver.com/download 可以下载。 官方还提供了线程配置器,程序烧录器以及配套的模板历程,可以直接导入进编译器。这些资料从地址:http://www.gxchip.cn/down/show-70.html 可以下载。 导入程序后的效果如图1-1所示: 图1-1 导入工程 通过线程配置器完成线程的配置如图1-2所示: 图1-2 完成线程的配置 修改线程内容如图1-3所示: 图1-3修改线程内容 完成编译通过下载烧录工具进行烧录如图1-4所示: 图1-4 烧录工具 2.程序编写测试 本文主要针对该芯片的GPIO,UART和线程之间的切换进行测试 我在线程0中接受串口传回的值,并解析成二进制,点亮或熄灭对应的led灯;在线程1中接收串口的值,并打印出去;在线程3和线程4中同时翻转led,来测试每个线程执行的顺序 int bss_value1; u16 rx_data; void delay(u32 time) { for (u32 var = 0; var < time; ++var) { NOP(); } } void gpio_read_val(u32 gpio_sel) { INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)); // GPIO_SET_INPUT_EN_VALUE(gpio_sel,(GPIO_PIN8|GPIO_PIN9|GPIO_PIN10|GPIO_PIN11),GPIO_SET_ENABLE); GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,(GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3),GPIO_SET_ENABLE); /*< 完成io初始化 */ GPIO_SET_OUTPUT_PIN_VALUE(gpio_sel,(GPIO_PIN0|GPIO_PIN1|GPIO_PIN2|GPIO_PIN3),(bss_value1)); for (u32 var = 0; var < 5000; ++var); } //////////////////////////////////////////////////////////// void thread_end(void) { while(1); } //////////////////////////////////////////////////////////// void thread0_main(void) { while(1){ gpio_read_val(GPIOA_BASE_ADDR); } thread_end(); } //////////////////////////////////////////////////////////// void thread1_main(void) { INTDEV_SET_CLK_RST(GPCOM8_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4)); GPCOM_SET_IN_PORT(GPCOM8_BASE_ADDR,(GPCOM_RXD_IS_P2)); //设置p2为rxd GPCOM_SET_OUT_PORT(GPCOM8_BASE_ADDR,( \ GPCOM_P0_OUTPUT_DISABLE|GPCOM_P3_OUTPUT_ENABLE|GPCOM_P2_OUTPUT_DISABLE|GPCOM_P1_OUTPUT_DISABLE| \ GPCOM_P0_IS_HIGH |GPCOM_P3_IS_TXD |GPCOM_P2_IS_HIGH |GPCOM_P1_IS_HIGH \ )); GPCOM_SET_COM_MODE(GPCOM8_BASE_ADDR,GPCOM_UART_MODE); //设置模式为串口模式 GPCOM_SET_COM_SPEED(GPCOM8_BASE_ADDR,12000000,115200); //设置波特率 GPCOM_SET_OVERRIDE_GPIO(GPCOM8_BASE_ADDR, ( \ GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \ GPCOM_P3_OVERRIDE_GPIO \ )); // u8 rx_data_rp=0; rx_data_rp=GPCOM_GET_RX_WP(GPCOM8_BASE_ADDR); GPCOM_PUSH_TX_DATA(GPCOM8_BASE_ADDR,rx_data_rp); while(1){ // user code section if(rx_data_rp!=(GPCOM_GET_RX_WP(GPCOM8_BASE_ADDR))) { bss_value1=GPCOM_GET_RX_DATA(GPCOM8_BASE_ADDR,rx_data_rp); GPCOM_PUSH_TX_DATA(GPCOM8_BASE_ADDR,bss_value1); rx_data_rp++; rx_data_rp &= 0x0f; } } thread_end(); } //////////////////////////////////////////////////////////// void thread2_main(void) { INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)); GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN4),GPIO_SET_ENABLE); while(1){ //TIMER_COMPARER_EXAMPLE(TIMER2_BASE_ADDR); //user code section GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR,(GPIO_PIN4)); delay(5); } thread_end(); } //////////////////////////////////////////////////////////// void thread3_main(void) { INTDEV_SET_CLK_RST(GPIOA_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)); GPIO_SET_OUTPUT_EN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN6),GPIO_SET_ENABLE); while(1){ //TIMER_COMPARER_EXAMPLE(TIMER2_BASE_ADDR); //user code section GPIO_SET_OUTPUT_PIN_INV(GPIOA_BASE_ADDR,(GPIO_PIN6)); delay(5); } thread_end(); } 测试结果如下: 与freertos相比,该芯片可以通过全局变量来进行数据的传递,无需定义队列等操作。 与此同时线程2和线程3在同时翻转电平,经测试线程3会比线程2慢大约100ns,这可能是线程之间转换所导致的延迟。如图所示: 本文主要验证了该芯片的串口,GPIO,多线程切换的功能。因为最近正在调试ad7124芯片,下一步将尝试着用该芯片去控制ad7124进行数据采集。