经过几天的学习,对ME32开发有了一些基础认识,所以咱们在这儿抛砖引玉。通过边学习边解析的方式让大家更容易了解这款芯片:
例程实现的是8路全彩LED 点亮,且循环渐变很是迷幻的效果~
在这儿夸夸中文手册,确实方便了不少;如下的GPIO,一目了然,不过相比STM32,这里没有IO口速度配置,换句话说功耗应该会高一点吧??
下面是例程,咱们开始分析:
#define MAX_LIGHT_NUMBER 8
__align(4) uint8_t org_rgb[3]={0xFF,0x0,0x0};
__align(4) uint8_t rgb[MAX_LIGHT_NUMBER][3];
uint32_t * rgbptr;
uint32_t * rgbendptr;
uint8_t start_color=0;
uint32_t data_index=0;
int main(void)
{
SystemInit ();
PB15_INIT(PB15_BTIM0_MAT0);
PC12_INIT(PC12_BTIM0_MAT0);
BTIM_Init(BTIM0, 16000000);
BTIM_ConfigPWMDataSift(BTIM0, 20, 5, 20, 15);
NVIC_EnableIRQ(BTIM0_IRQn);
BTIM_Init(BTIM1, 10000);
BTIM_ConfigMatch1(BTIM1, 1000, TIM_MATCH_RESET_COUNTER|TIM_MATCH_TRIGGER_INT);
NVIC_EnableIRQ(BTIM1_IRQn);
TIM_START(BTIM1);
PB->DIR_b.DIR10 =0x1;
PC->DIR_b.DIR4 =0x1;
while(1)
{
PB->OUT_b.OUT10=1;
SYS_Delay(0xFFFF);
PB->OUT_b.OUT10=0;
SYS_Delay(0xFFFF);
}
}
void BTIM0_IRQHandler(void)
{
rgbptr=BTIM_DataSiftInt(BTIM0, rgbptr, rgbendptr);
BTIM_ClearIntFlag(BTIM0);
}
void BTIM1_IRQHandler(void)
{
uint32_t i;
switch (start_color)
{
case 0:
org_rgb[0]=org_rgb[0]-51;
org_rgb[1]=org_rgb[1]+51;
if (org_rgb[1]==0xFF)
start_color=1;
break;
case 1:
org_rgb[1]=org_rgb[1]-51;
org_rgb[2]=org_rgb[2]+51;
if (org_rgb[2]==0xFF)
start_color=2;
break;
case 2:
org_rgb[2]=org_rgb[2]-51;
org_rgb[0]=org_rgb[0]+51;
if (org_rgb[0]==0xFF)
start_color=0;
break;
}
for (i=MAX_LIGHT_NUMBER-1;i>0;i--)
{
rgb[i][0]=rgb[i-1][0];
rgb[i][1]=rgb[i-1][1];
rgb[i][2]=rgb[i-1][2];
}
rgb[0][0]=org_rgb[0];
rgb[0][1]=org_rgb[1];
rgb[0][2]=org_rgb[2];
rgbptr=(uint32_t *)rgb;
rgbendptr=rgbptr+((MAX_LIGHT_NUMBER*3)>>2);
if ((MAX_LIGHT_NUMBER*3)&0x3)
rgbendptr++;
rgbptr=BTIM_StartDataSift(BTIM0, rgbptr, rgbendptr);
BTIM_ClearIntFlag(BTIM1);
PC->NOT_b .NOT4 =1;
}
依据以上注释,不知道理解是否正确呢?我们同时外挂一个彩色LED灯带,将洪定义MAX_LIGHT_NUMBER 改为50,照样驱动稳稳的!
这里咱们做一下输出时序的波形测试,可看到单总线的高低电平情况:
以及定时器0的IO口翻转波形: