一、线程资源分配
使用线程配置工具_V1.exe分配各线程的运行速度和栈空间
最大主频1/4,最小主频1/1024;
如图128K BYTE存储空间分了代码存储器和数据存储器各64K;
时钟源选择外部无源晶振;(开发板自带48M晶振,即主频48M)
开启了线程0、1、2、3共4各线程,每个线程占1/4主频,即运行速度12M,线程栈空间都分配128bytes.然后点击生成代码。生成thread_config.h、MC3172.lds两个文件,
二、MounRiver Studio 下载安装
MounRiver Studio 下载地址:
http://www.mounriver.com/download
三、MounRiver Studio 工程,
开发资料里有建好的工程,我就直接用了,就没有再创建工程。
四、个人代码编写。
在./USER_CODE/main.c里对应的 threadn_main 函数中实现自己的代码
我配置了0、1、2、3四个线程。但是我只用了0、1这两个线程。
参考GPIO_GPCOM_TIMER_Example.c调用各个外设和接口。
thread0_main 里实现对LED1来个闪烁,点灯大师开始点灯。
void thread0_main(void)
{
INTDEV_SET_CLK_RST(GPIOD_BASE_ADDR,(INTDEV_RUN|INTDEV_IS_GROUP0|INTDEV_CLK_IS_CORECLK_DIV2)); //启动GPIOD的时钟
GPIO_SET_OUTPUT_EN_VALUE(GPIOD_BASE_ADDR,(GPIO_PIN_15_8),GPIO_SET_ENABLE); //使能GPIO输出
while(1){
GPIO_SET_OUTPUT_PIN_INV(GPIOD_BASE_ADDR,GPIO_PIN8); //翻转GPIO输出值
for (u32 var = 0; var < 12000000; ++var) {
NOP(); //延时 线程频率12M,一次NOP停止线程一个机器周期。
}
//user code section
//GPIO_EXAMPLE(GPIOA_BASE_ADDR);
}
thread_end();
}
上述代码实现1S翻转一次 PD8; 查看原理图可以得知LED 接到PD8;
thread1_main来玩玩UART,在GPIO_GPCOM_TIMER_Example.c里面有现成的UART例子 GPCOM_UART_EXAMPLE,就直接调用了,懒得自己写了,
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)); //设置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 \\
)); //设置P3输出引脚
GPCOM_SET_COM_MODE(gpcom_sel,GPCOM_UART_MODE); //设置工作模式
GPCOM_SET_COM_SPEED(gpcom_sel,12000000,115200); // 设置波特率 刚好线程频率12M
GPCOM_SET_OVERRIDE_GPIO(gpcom_sel, ( \\
GPCOM_P2_OVERRIDE_GPIO|GPCOM_P2_INPUT_ENABLE | \\
GPCOM_P3_OVERRIDE_GPIO \\
)); //设置串口映射GPIO
#ifdef TEST_ONLY_UART_TX
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); //读取RX
while(1) {
if(rx_data_rp!=(GPCOM_GET_RX_WP(gpcom_sel))){
rx_data=GPCOM_GET_RX_DATA(gpcom_sel,rx_data_rp); //读取RX
GPCOM_PUSH_TX_DATA(gpcom_sel,rx_data); //TX发送
rx_data_rp++;
rx_data_rp&=0x0f;
}
}
#endif
}
void thread1_main(void)
{
GPCOM_UART_EXAMPLE(GPCOM3_BASE_ADDR);
while(1){
//user code section
//GPCOM_UART_EXAMPLE(GPCOM8_BASE_ADDR);
}
thread_end();
}
如上代码所示,配置了UART COM3,把COM_P2设为RX,COM3_P3设为TX;代码实现的功能是把输入的内容原封不动的丢回去。
查看感芯MC3172手册_V1.11得知:
COM3_P2----------PA14
COM3_P3----------PA15
查看IO排序图得知开发板 PA14,PA15,GND的位置。
接线:
PA14-----接-----串口模块TX
PA15-----接-----串口模块RX
GND-----接-----串口模块GND
交叉接法。
接上串口模块,用串口助手调试。
如上图,串口助手发啥,模块就回啥,好的,UART调试成功了。
试用很成功!
MC3172是一款很棒的MCU,业内首个64线程同步并行运行,线程资源可按需配置,共享代码段空间与数据段空间,硬件级实时响应,无需中断服务程序,无需实时操作系统。
基于RISC-V RV32IMC 指令集,100%单周期指令,最高200MHz主频,3.37coremark/MHz。
数据段与代码段共享128K字SRAM,可按需配置为96K代码空间加32K数据空间,或64K代码空间加64K数据空间,或32K代码空间加96K数据空间,灵活应对各种应用场景。
拥有丰富片内外设:12个可配置通信接口,可按需配置为UASRT或SPI或USB或CAN总线形式,满足多通信端口需求;6个双缓冲24位计数器,可提供高精度PWM与输入捕捉;64个GPIO,可提供丰富的自定义控制
接口。
更多回帖