热度 11
2022-10-26 10:48
1945 次阅读|
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进行数据采集。