开箱感芯科技MC3172开发板并给大家做测评了,后面有技术资料哦!
快递包装做的很到位,一个较大的包装盒,里面基本全是塑料气泡袋,保护的很好,打开气泡袋里面就是一个小巧可爱的塑料盒,也就是我们今天的主角感芯科技MC3172开发板。
开发板背面主芯片
随感芯科技MC3172开发板发的说明书。
厦门感芯科技的MC3172芯片,具有硬件[多线程]实现的功能,可以摆脱单片机那种[RTOS]的线程调度问题,不用考虑资源占用问题。在一定程序上,可以代替功能简单的FPGA,具有了完全并行的处理能力。
相关资料可在感芯官网下载。链接:
http://www.gxchip.cn/
MC3172 特性:
这款芯片有两个特别的地方:
1,并行多线程,有点大家理解;
2,12个通信接口可配置。
开发板很简单,基本上引出了所有的IO,上图。
开发板自带下载器,软件开发软件使用的是
官方资料合集:1. MC3172芯片资料合集稳定版 - - - 厦门感芯科技有限公司
开源仓库:https://gitee.com/gxchip1.
工程模板:https://gitee.com/gxchip/mc3172_template2.
CMAKE工程:https://github.com/dreamcmi/MC3172-CMake
开发工具:1. MRS:http://www.mounriver.com/download
安装完软件后,开始干活,先做个测试GPIO功能吧。
测试GPIO功能
目前此款芯片还处于研发初期,外设较少,所以这里简单的进行演示。
将GPIO_GPCOM_TIMER_Example.c文件中的GPIO操作进行复制,稍作改变,实现一个对GPIO的读取和输出。
代码如下:
// gpio测试,gpio_sel为任意一个gpio组,其值在MC3172.h中定义
void GPIO_TEST(u32 gpio_sel)
{
// 使能对应的时钟
INTDEV_SET_CLK_RST(gpio_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
// 设置pin7为输出,pin11为输入
GPIO_SET_OUTPUT_EN_VALUE(gpio_sel,(GPIO_PIN7),GPIO_SET_ENABLE);
GPIO_SET_INPUT_EN_VALUE(gpio_sel,(GPIO_PIN11),GPIO_SET_ENABLE);
// 这里先输出高电平看一下现象
GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN7));
while(1) {
// 读取这组的GPIO电平值
u16 rx_data;
rx_data=GPIO_GET_INPUT_VALUE_SAFE(gpio_sel);
// 延时
for (u32 var = 0; var < 5000; ++var) {
NOP();
}
// 判断pin11引脚电平高低,如果高电平,则PIN7输出高电平;反之,输出低电平
if(rx_data & (1<<11))
{
GPIO_SET_OUTPUT_PIN_TO_1(gpio_sel,(GPIO_PIN7));
}
else
{
GPIO_SET_OUTPUT_PIN_TO_0(gpio_sel,(GPIO_PIN7));
}
// 延时
for (u32 var = 0; var < 5000; ++var) {
NOP();
}
}
}
// 在线程中调用这个“任务”
void thread0_main(void)
{
while(1){
GPIO_TEST(GPIOD_BASE_ADDR);
}
thread_end();
}
实验现象: PIN7跟随PIN11的电平高低进行变化。
3.2 uart测试
同理,对uart进行测试,
代码如下:
// 此函数是将对应GPCOM口的P2作为RX,P3作为TX;具体选择那个GPCOM口,可以在头文件中定位
void GPCOM_UART_EXAMPLE(u32 gpcom_sel)
{
INTDEV_SET_CLK_RST(gpcom_sel,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV4));
GPCOM_SET_IN_PORT(gpcom_sel,(GPCOM_RXD_IS_P2));
GPCOM_SET_OUT_PORT(gpcom_sel,( \\
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(gpcom_sel,GPCOM_UART_MODE);
// 设置波特率为115200
GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200);
GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \\
GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \\
GPCOM_P3_OVERRIDE_GPIO \\
));
#ifdef TEST_ONLY_UART_TX
// 如果定义了这个宏,会一直输出0x31
while(1){
while(GPCOM_TX_FIFO_FULL(gpcom_sel));
for (u32 var = 0; var < 90; ++var) {
NOP();
}
GPCOM_PUSH_TX_DATA(gpcom_sel,0x31);
}
#else
// 默认是这部分逻辑,即输入什么,就输出什么,类似回环测试。
u8 rx_data_rp=0;
u8 rx_data=0;
rx_data_rp=GPCOM_GET_RX_WP(gpcom_sel);
while(1) {
if(rx_data_rp!=(GPCOM_GET_RX_WP(gpcom_sel))){
rx_data=GPCOM_GET_RX_DATA(gpcom_sel,rx_data_rp);
GPCOM_PUSH_TX_DATA(gpcom_sel,rx_data);
rx_data_rp++;
rx_data_rp&=0x0f;
}
}
#endif
}
// 注意:这里是thread1,thread0可以保持不动,相当于有2个任务在执行!
void thread1_main(void)
{
while(1){
GPCOM_UART_EXAMPLE(GPCOM4_BASE_ADDR); // 选择PB2,PB3,可看手册或者下图所示;
}
thread_end();
}
下图可以看出,将GPCOM4的基地址写入,就是PB2,PB3;当然也可以按照需求进行更改(这里的GPCOM可以选择任意功能):
3.3 体验多线程并行
一种很简单的方法,就是再来一组GPIO进行3.1的测试,如果按照以前单片机的开发模式,在线程1死等时,是无法执行其他线程的,这里就可以进行实现:
代码如下:
// 只添加这部分
void thread2_main(void)
{
while(1){
// 添加PA7,PA11作为另一个测试,然后将PA11和PD11进行短接,然后拉低拉高即可
GPIO_TEST(GPIOA_BASE_ADDR);
}
thread_end();
}
芯片如果价格下来,是可以完败大部分现在的MCU的。
它更容易进行任务级别的应用开发,因而不用考虑多线程之间的调度问题,MC3172开发板也值得大家抽时间多多了解和关注。
更多回帖