使用TC397 KIT,点亮LED D107,D108,D109,D110。单独500ms亮灭,并在最后以group形式一起亮灭。
使用TC397 KIT开发板,硬件上的LED D107,D108,D109,D110。
使用TC397 EB MCAL开发从0开始系列 之 [2.0] PORT配置 - 上电点亮LED对应的ADS及EB基础工程。
增加DIO模块,增加对MCU STM系统定时器的使用。
具体可在MC-ISAR_TC3xx_UM_Basic.pdf及MC-ISAR_TC3xx_Config_Verification_Manual_BASIC.pdf中查看模块的配置描述,和配置生成动态代码描述。
配置PORT模块,选中PORT13,因为LED对应的为P13.0-P13.3。
修改PORT名称,这个在生产代码中不会体现,只是方便去看EB的PORT配置用途。
配置默认为输出,高电平,低电平时LED打开,因此初始化PORT时希望LED为关闭。
添加DIO的PORT,有多少个PORT添加多少组,比如这里是P13,只用了一组,我们添加一个即可。
Dio Port需要和具体对应,即DioPortId对应Port端口号,即P13。
该DioPort有几个Pin需要控制,就添加几个,我们这里是4个,添加后修改Name,并且确认DioChannelId与P13.0-P13.3对应。
添加DioChannelGroup,Group是作为一组控制的方法,可一起控制Port输出。由于我们测试功能里需要一起控制的功能,因此添加一个,正常使用不需要一起控制时不需要添加。
DioPortMask这个应该定义为channel的位置,即二进制对应的bit位,我们用的是P13.0-P13.3,在DioChannelId 中对应0-3,即00001111=0xf。
在Dio_Cfg.h中配置生成代码如下:
/*
DIO PORT : (DioPort_0)
*/
#ifndef DioConf_DioPort_DioPort_0
#define DioConf_DioPort_DioPort_0 (DIO_PORT_13)
#endif
/* DIO Channel : (D107_LED_P13_0) */
#ifndef DioConf_DioChannel_D107_LED_P13_0
#define DioConf_DioChannel_D107_LED_P13_0 (DIO_CHANNEL_13_0)
#endif
/* DIO Channel : (D108_LED_P13_1) */
#ifndef DioConf_DioChannel_D108_LED_P13_1
#define DioConf_DioChannel_D108_LED_P13_1 (DIO_CHANNEL_13_1)
#endif
/* DIO Channel : (D109_LED_P13_2) */
#ifndef DioConf_DioChannel_D109_LED_P13_2
#define DioConf_DioChannel_D109_LED_P13_2 (DIO_CHANNEL_13_2)
#endif
/* DIO Channel : (D110_LED_P13_3) */
#ifndef DioConf_DioChannel_D110_LED_P13_3
#define DioConf_DioChannel_D110_LED_P13_3 (DIO_CHANNEL_13_3)
#endif
/*DIO Channel Group : DioChGrpId_P13_0*/
#ifndef DioConf_DioChannelGroup_DioChannelGroup_0
#define DioConf_DioChannelGroup_DioChannelGroup_0 (&Dio_Config.Dio_ChannelGroupConfigPtr[0])
#endif
工程中使用到了定时,延时功能,需要使用系统定时器,这里只用了Stm的Tick,不需要添加STM模块,使用MCU的STM即可。
在McuHardwareResourceAllocationConf_0中的McuStmAllocationConf,配置使用STM0,CMP0
配置使用STM0,CMP0给STM。
配置使用资源,分配核,在CORE0中添加STM,McuStmAllocationConf_0。
打开ADS,设置Active(可以编译调试)。
开始调试,点击小甲虫。
烧录完成后,直接run,看板子上的LED0-LED3亮灭变化。
main中的源码如下,可按照功能运行,LED0-LED3先亮灭0.5s,最后再一起亮灭0.5s,周期往复。
#include "Ifx_Ssw_Infra.h"
#include "IFX_Os.h"
#include "Port.h"
#include "Dio.h"
#include "McalLib.h"
//stm 100MHZ ticks 0.00000001s, 1s 100000000
void delay_ms(uint32 ms)
{
uint32 CurrSTMTick = Mcal_DelayGetTick();
uint32 BaseSTMTick = CurrSTMTick;
while ((uint32)((CurrSTMTick - BaseSTMTick) & 0xffffffff) <
ms * 100000)
{
CurrSTMTick = Mcal_DelayGetTick();
}
}
void core0_main (void)
{
volatile unsigned short LoopFlag = 1U;
unsigned short cpuWdtPassword;
unsigned short safetyWdtPassword;
ENABLE();
/*
* !!WATCHDOG0 AND SAFETY WATCHDOG ARE DISABLED HERE!!
* Enable the watchdog in the demo if it is required and also service the watchdog periodically
* */
cpuWdtPassword = Ifx_Ssw_getCpuWatchdogPassword(&MODULE_SCU.WDTCPU[0]);
safetyWdtPassword = Ifx_Ssw_getSafetyWatchdogPassword();
Ifx_Ssw_disableCpuWatchdog(&MODULE_SCU.WDTCPU[0], cpuWdtPassword);
Ifx_Ssw_disableSafetyWatchdog(safetyWdtPassword);
/* init gpio high, led close */
Port_Init(&Port_Config);
while (LoopFlag == 1U)
{
/* close led */
Dio_WriteChannel(DioConf_DioChannel_D107_LED_P13_0, STD_HIGH);
delay_ms(500);
/* open led */
Dio_WriteChannel(DioConf_DioChannel_D107_LED_P13_0, STD_LOW);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D108_LED_P13_1, STD_HIGH);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D108_LED_P13_1, STD_LOW);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D109_LED_P13_2, STD_HIGH);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D109_LED_P13_2, STD_LOW);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D110_LED_P13_3, STD_HIGH);
delay_ms(500);
Dio_WriteChannel(DioConf_DioChannel_D110_LED_P13_3, STD_LOW);
delay_ms(500);
Dio_PortLevelType GroupLevel;
GroupLevel = 0xf; // set gpio high, led close
Dio_WriteChannelGroup(DioConf_DioChannelGroup_DioChannelGroup_0, GroupLevel);
delay_ms(500);
GroupLevel = 0; // set gpio high, led open
Dio_WriteChannelGroup(DioConf_DioChannelGroup_DioChannelGroup_0, GroupLevel);
delay_ms(500);
}
}
->返回总目录-<