原创
【MC3172】从freertos到并行处理器的成长
从今年暑假开始,接触到了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进行数据采集。
作者: 文件转输管家, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-4009904.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论