经过一天的捣鼓,总算把MC3172并行多线程实时处理器的开发整明白了。
首先需要准备的开发环境如下:
认识开发板,首先从引脚入手,选择我们想要的外设引脚进行连接,或者找到板载资源的相关引脚。
这里借用@XMGroupe.大神的图,大家可以去看看他的帖子。[XMG助力国产]MC3172核心板管脚图美化版 / 感芯科技 / WhyCan Forum(哇酷开发者社区)
这里我通过点灯来验证环境的搭建是否正确。
打开原理图,找到板载LED的引脚PD8,一会要实现的就是对PD8的控制。
接下来使用MounRiver Studio打开工程,这里只能用官方提供的工程文件打开,MounRiver Studio是找不到这个芯片的。
我们找到thread_config.h,一会要用到线程配置工具_V1进行配置,上图是设置后的图。还没配置的兄弟可以先截图,和一会配置好后进行对比。
这里我先配置4个进程,如图所示,至于设置的方案可以参考*附件:并行多线程处理器MC3172开发极简指南(1).pdf
点击生成代码就会看到左侧的数据变化。
然后我们就可以打开熟悉的main.c文件了
每个线程可以有一个main函数,到这里是不是能悟到多任务变成在这个单片机上的开发即将变得很容易。
没错,只要把前面的线程配置好,这里直接写任务程序就可以,不用担心任务之间的相互干扰,担任是指一个线程一个任务。
废话不多说,先讲下IO口 的配置程序
INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2))
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE)
INTDEV_SET_CLK_RST这个函数是用来启动外设的,一般修改第一个参数就可以,比如我这里用的是GPIOD口就写成GPIOD_BASE_ADDR,如果是GPIOA口就写成GPIOA_BASE_ADDR;其他两个参数是设置外设使用的时钟频率以及特权组,特权组是什么还没搞明白,希望有大神在下面指点迷津。
GPIO_SET_OUTPUT_EN_VALUE这个函数是用来将GPIO口输出使能的;
GPIO_SET_OUTPUT_PIN_TO_1(GPIOA_BASE_ADDR,(GPIO_PIN2|GPIO_PIN15|GPIO_PIN11));
这个函数用于把指定管脚输出 1,同时不影响其他管脚值。
函数 GPIO_SET_OUTPUT_PIN_TO_0 用于输出 0;
函数GPIO_SET_OUTPUT_PIN_INV 用于输出值取反。
另外还提供了GPIO_SET_OUTPUT_PIN_VALUE(GPIOA_BASE_ADDR,(GPIO_PIN3|GPIO_PIN12|GPIO_PIN5),0xabcd);用于把指定管脚输出特定值,注意值得每个 bit 对应 GPIO 的每个管脚,同时不影响未选择的管脚值
其他关于GPIO的函数还有读取的:
GPIO_GET_INPUT_VALUE_SAFE(GPIOA_BASE_ADDR);
GPIO_GET_INPUT_VALUE_FAST(GPIOA_BASE_ADDR);
具体内容用途开发指南就有这里就不继续说明了。
*附件:并行多线程处理器MC3172开发极简指南(2).pdf
下面我用一个闪烁的灯对比来让大家感受下多线程的区别,见下方视频。
代码1
void thread0_main(void)
{
INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE);
while(1){
GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,(GPIO_PIN8));
for (u32 var = 0; var < 500000; ++var) {
NOP();
}
}
thread_end();
}
代码2
void thread2_main(void)
{
INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2));
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN8),GPIO_SET_ENABLE);
while(1){
GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,(GPIO_PIN8));
for (u32 var = 0; var < 5000000; ++var) {
NOP();
}
}
thread_end();
}
下个月得去培训,等培训完在讲讲串口的那些事