1、port的输出
首先是led是4*4矩阵。
硬件驱动说明,行的控制是PMOS驱动,低电平有效,列的控制是NMOS驱动,高电平有效。
引脚映射:
行:XS1_PORT_4C,列:XS1_PORT_4D。
引脚:
行:
LED_ROW_0----X1D14
LED_ROW_1----X1D15
LED_ROW_2----X1D20
LED_ROW_3----X1D21
列:
LED_COL_0----X1D16
LED_COL_1----X1D17
LED_COL_2----X1D18
LED_COL_3----X1D19
/******************************************正确运行程序***********************************************/
#include "xs1.h"
#include "stdio.h"
#include <platform.h>
on tile[1]: out port led_row = XS1_PORT_4C;//映射port引脚,且指定在tile[1]上的port
on tile[1]: out port led_col = XS1_PORT_4D; //映射port引脚,且指定在tile[1]上的port
void led(void)
{
while(1)
{
led_row <: 0x0; //置低电位
led_col <: 0xF; //置高电位
}
}
int main(void)
{
par
{
on tile[1]: led();
}
return 0;
}
/********************************************************************************/
首先如果一开始在端口声明中带了“on tile[1]:”,而在调用port的操作函数时没有指定tile,那么编译器就会报错。
例如:在全局中,声明了:on tile[1]: out port led_row = XS1_PORT_4C;
on tile[1]: out port led_col = XS1_PORT_4D;
然后主函数中,没有用到或者是led();函数前没有加“on tile[1]:”,那么就会报错。
报错如下:
报错:Error: Resource "led_row" placed on "tile[1]" will not be initialised without a multi-tile main function.
解决办法:
led_row和led_col指定on tile[1]运行的port,加上“on tile[1]:”,重新编译就可以了。问题就处在你指定了芯片的tile的硬件资源却没有用它,编译器就会认定为违规。
这种情况主要发生在多core的芯片上,因为单Core的芯片上port 默认在tile[0]上。
简而言之就是在port的映射上,首先要查看port映射表,看所用到的引脚在哪个块上。(注解:引脚标号 XnDpq, n 指代芯片上xCore上的标号,pq 为引脚标号。)
例如上面用到的 XS1_PORT_4C 指代的引脚为4 bit 的port,该port指代了(X1D14、X1D15、X1D20、X1D21 这4个引脚。这也是XMOS和其他单片机之间所不同的地方,这个主要是因为XMOS的底层硬件框架的不同所确定的)。