您的位置:首页 > 其它

Freescale MKL26Z256xxx4初始化模板

2015-06-23 17:16 225 查看
IAR配置:

工程选项--
通用选项:型号 Freescale MKL26Z256xxx4
库设置:library 选 full

C/C++编译 preprocessor中:
$PROJ_DIR$\..\..\App
$PROJ_DIR$\..\..\App\Inc
$PROJ_DIR$\..\..\Board\Inc
$PROJ_DIR$\..\..\Chip\inc
$PROJ_DIR$\..\..\Chip\inc\IAR
$PROJ_DIR$\..\..\Chip\inc\kinetis
$PROJ_DIR$\..\..\Lib\CMSIS\Inc
$PROJ_DIR$\..\..\Lib\SD_CARD
定义符号
DEBUG
MKL26Z4
ARM_MATH_CM0PLUS

链接器中:override default选中
导入 $PROJ_DIR$\config files\256KB_Pflash.icf (此文件可以外加)

延时函数=============================================================================================================

DELAY_MS(500);  //延时500毫秒(自动获取空闲定时器)

DELAY_US(500); //延时500微秒

DELAY();  //延时500毫秒

lptmr_delay_ms(1000);                               //使用LPTMR延时: 1000ms

pit_delay_ms(PIT0, 1000);                           //使用PIT0延时: 1000ms

systick_delay_ms(1000);                             //使用SysTick延时: 1000ms

GPIO配置=============================================================================================================

gpio_init(PTD4,GPO,1);  //GPIO初始化函数(必要!)参数1:引脚   参数2:输入输出选择(GPI入GPO出)  参数3:0为低1为高

gpio_set(PTD4,0); //设置IO口电平

gpio_ddr(PTD4,GPO);  //1:引脚,2:输入输出

gpio_turn(PTD4);  //翻转电平

gpio_get(PTD4);  //获取端口电平

GPIO_SET_NBIT(4,PTD4,9); //GPIO4~7(后4个)的输出电平情况是1001,转换为十进制为9

GPIO_GET_NBIT(4,PTD4);  //获取4~7电平

内置LED控制函数======================================================================================================

LED的对应引脚为:
PTD4,PTD5,PTD6,PTD7

led_init(LED0);  //初始化PTD4为LED0

led(LED0, LED_ON);  //LED0 亮

led_turn(LED0);  //LED1翻转

led(LED0, LED_OFF); //LED0 灭

内置按键控制===========================================================================================================

KEY引脚
PTC7, PTC8, PTA4, PTC6, PTE26, PTC9, PTC16, PTC17

用法:
key_init(KEY_B);
if(key_check(KEY_B) == KEY_DOWN) //检测key状态(带延时消抖)
{
printf("\n按键按下");   //通过串口助手查看,提示按键按下

DELAY_MS(500);
}

定时扫描按键:

全局定义量:
char * keyname[KEY_MAX]={"KEY_U","KEY_D","KEY_L","KEY_R","KEY_A","KEY_B","KEY_START","KEY_START"};
//定义8个key引脚的别名(按顺序)
char * keystatus[3]={"按下","弹起","长按"}; //定义key的3个状态别名(此为唯一顺序)

main中:
KEY_MSG_t keymsg; //定义消息结构体,名为keymsg
key_init(KEY_MAX); //初始化8个按键
lptmr_timing_ms(10);    // LPTMR 定时 10ms
set_vector_handler(LPTMR_VECTORn,lptmr_hander);   // 设置中断服务函数到中断向量表里
enable_irq(LPTMR_IRQn);                           // 使能LPTMR中断
while(1)
{
while(get_key_msg(&keymsg) == 1)  //如果KEY从引脚中得到消息(变化)
{
printf("\n按键%s%s",keyname[keymsg.key],keystatus[keymsg.status]); //.key为结构体指向引脚,.status为消息
}

DELAY_MS(500);                 //可以 调 延时时间,除非 FIFO满溢出,不然不会出现漏识别按键
}

全局函数:
void lptmr_hander(void)
{
LPTMR0_CSR |= LPTMR_CSR_TCF_MASK;         //清除LPT比较标志位

//下面由用户添加实现代码
key_IRQHandler();                           //内置按键扫描函数(需要配置10ms一次),扫描8个脚

}

串口=================================================================================================================

内置UART引脚定义:
#define UART0_RX_PIN    PTA15       //可选范围:PTA1、PTA15、PTB16、PTD6、PTE21
#define UART0_TX_PIN    PTA14       //PTA2、PTA14、PTB17、PTD7、PTE20
#define UART1_RX_PIN    PTC3        //PTA18、PTE1、PTC3                       PTA18不要用 (与晶振冲突)
#define UART1_TX_PIN    PTC4        //PTA19、PTE0、PTC4                       PTA19不要用 (与晶振冲突)
#define UART2_RX_PIN    PTD2        //PTD2、PTD4、PTE17、PTE23
#define UART2_TX_PIN    PTD3        //PTD3、PTD5、PTE16、PTE22

uart_init(UART0,115200); //初始化串口(由于 printf 函数 所用的端口就是 UART0,已经初始化了,因此此处不需要再初始化)

uart_putstr(UART0 ,"\n\n\n接收数据,并进行发送:");         //发送字符串

if(uart_query (UART0) != 0)                                 //查询是否接收到数据(是则进入if)

uart_getchar (UART0,&ch);                               //等待接收一个数据,保存到 ch里

uart_putchar(UART0, ch);                                //发送1个字节

if(uart_querychar (UART0, &ch) != 0)
//uart_getchar 和 uart_querychar 的区别在于 ,前者 需要等待接收到数据,后者查询是否接收到,接收到就接收,接收不到就退出

char str[100];
if(uart_querystr (UART0,str,sizeof(str)-1) != 0)                //查询是否接收到字符串,是则存入str进入if

UART中断用法:
set_vector_handler(UART0_VECTORn,uart0_handler);   // 设置中断服务函数到中断向量表里
uart_rx_irq_en (UART0);                                 //开串口接收中断
void uart0_handler(void)  //中断函数,放到全局区
{
char ch;

if(uart_query    (UART0) == 1)   //接收数据寄存器满
{
//用户需要处理接收数据
uart_getchar   (UART0, &ch);                    //无限等待直到接受1个字节
uart_putchar   (UART0 , ch);                    //发送字符串
}
}

ADC采集================================================================================================================

adc_init(ADC0_DM0);   //ADC初始化

ADC通道别名表:
ADC0_DP0 = 0,   // PTE20
ADC0_SE0 = 0,

ADC0_DP1 = 1,   // PTE16
ADC0_SE1 = 1,

ADC0_DP2 = 2,   // PTE18
ADC0_SE2 = 2,

ADC0_DP3 = 3,   // PTE22
ADC0_SE3 = 3,

ADC0_DM0 = 4,   // PTE21
ADC0_SE4a= 4,

ADC0_DM1 = 5,   // PTE17
ADC0_SE5a= 5,

ADC0_DM2 = 6,   // PTE19
ADC0_SE6a= 6,

ADC0_DM3 = 7,   // PTE23
ADC0_SE7a= 7,

uint16 var;
var = adc_once(ADC0_DM0, ADC_8bit);  //一次采样
printf("\nADC采样结果为:%d,电压为%dmV",var,(var*3300)/256);

DAC模拟输出===========================================================================================================

DAC0_OUT_PIN    PTE30

dac_init(DAC0);
result =(uint16) (((sin(val)+1.0)/2.0 )    *((1<<12) - 1));
//sin 的取值范围是 -1 ~ 1 ,加1 后变成 0~2 ,再 除以 2 确保范围在 0~1 之间,DAC 是 12bit
dac_out(DAC0, result);                      //输出 DAC ,可通过示波器看到正弦波

LPTMR定时中断=========================================================================================================

lptmr_timing_ms(1000);                                  //初始化LPTMR,定时时间为: 1000ms
set_vector_handler(LPTMR_VECTORn ,LPTMR_IRQHandler);    //设置LPTMR的中断服务函数为 LPTMR_IRQHandler
enable_irq (LPTMR_IRQn);                                //使能LPTMR中断

void LPTMR_IRQHandler(void)
{
led_turn(LED0);           //闪烁 LED0

LPTMR_Flag_Clear();       //清中断标志位
}

LPTMR计时=============================================================================================================

lptmr_time_start_ms();                  //开始计时(已经经过失能清零使能)

timevar = lptmr_time_get_ms();          //停止计时,获取计时时间,保存到变量中,单位为ms,返回 0xffffffff 表示溢出

lptmr_time_close();  //先关了LPT,自动清计数器的值,清空溢出标记

LPTMR脉冲计数=========================================================================================================

LPTMR引脚:
LPT0_ALT1 = 1,      // PTA19
LPT0_ALT2 = 2       // PTC5

#define INT_COUNT  0xFFFF
lptmr_pulse_init(LPT0_ALT2,INT_COUNT, LPT_Rising);
//初始化脉冲计数器,用LPT0_ALT2,即PTC5输入,每隔INT_COUNT产生中断(需要开中断才能产生中断),上升沿触发

lptmr_pulse_clean();                                    //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)

count=lptmr_pulse_get();                  //保存脉冲计数器计算值

PIT定时中断===========================================================================================================

void PIT_IRQHandler(void)
{
//PIT0 和 PIT1 共用相同中断号,所以两者都共用相同中断函数,需要根据标志位来判断是由哪个PIT触发中断

if(PIT_TFLG(PIT0) == 1 )        //判断是否 PIT0 进入中断
{
led_turn(LED0);             //闪烁 LED0

PIT_Flag_Clear(PIT0);       //清中断标志位
}
}

pit_init_ms(PIT0, 1000);                                //初始化PIT0,定时时间为: 1000ms
set_vector_handler(PIT_VECTORn ,PIT_IRQHandler);       //设置PIT0的中断服务函数为 PIT_IRQHandler
enable_irq (PIT_IRQn);                                 //使能PIT0中断

PIT计时===========================================================================================================

pit_time_start  (PIT0);                 //开始计时
timevar = pit_time_get_us    (PIT0);    //获取计时时间(微秒)
//pit_time_get_ms(PIT0);  //毫秒
//pit_close  (PIT0);                    //关闭PIT(可选择是否关闭)

systick================================================================================================================

延时:
systick_delay_ms(1000);                             //使用SysTick延时: 1000ms

中断:
systick_timing_ms(100);                                     //初始化滴答定时器,定时时间为: 100msset_vector_handler(SysTick_VECTORn ,SysTick_IRQHandler);    //设置滴答定时器的中断服务函数为 SysTick_IRQHandler

void SysTick_IRQHandler(void)
{
led_turn(LED0);             //闪烁 LED0
}

TPM_PMW================================================================================================================

tpm_pwm_init(TPM0, TPM_CH3,200*1000,30);   //初始化 TPM PWM ,使用 TPM0_CH3,频率为200k ,占空比为 30 /TPM0_PRECISON
// port_cfg.h 里 配置 TPM0_CH3 对应为 PTE30

tpm_pwm_duty(TPM0, TPM_CH3,30);     //设置占空比 为 30 / TPM0_PRECISON

内置TMP引脚定义:
#define TPM0_CH0_PIN    PTE24        //可选范围:PTE24、PTA3、PTC1、PTD0                PTA3不要用(与SWD冲突)
#define TPM0_CH1_PIN    PTE25        //PTE25、PTA4、PTC2、PTD1
#define TPM0_CH2_PIN    PTE29        //PTE29、PTA5、PTC3、PTD2
#define TPM0_CH3_PIN    PTE30        //PTE30、PTA6、PTC4、PTD3
#define TPM0_CH4_PIN    PTE31        //PTE31、PTA7、PTC8、PTD4
#define TPM0_CH5_PIN    PTE26        //PTE26、PTA0、PTC9、PTD5                 PTA0不要用(与SWD冲突)
#define TPM1_CH0_PIN    PTA12       //PTA12、PTB0、PTE20
#define TPM1_CH1_PIN    PTA13       //PTA13、PTB1、PTE21
#define TPM2_CH0_PIN    PTA1       //PTA1、PTB2、PTB18、PTE22
#define TPM2_CH1_PIN    PTA2       //PTA2、PTB3、PTB19、PTE23

TPM脉冲计数=============================================================================================================

引脚定义:
#define TPM_CLKIN0_PIN  PTC12       //可选范围:PTA18、PTB16、PTC12、PTE16、PTE29     PTA18不要用 (与晶振冲突)
#define TPM_CLKIN1_PIN  PTC13       //PTA19、PTB17、PTC13、PTE17、PTE30              PTA19不要用 (与晶振冲突)

tpm_pulse_init(TPM2,TPM_CLKIN0,TPM_PS_1); //初始化 TPM2 为脉冲累加,输入管脚为 TPM_CLKIN0_PIN ,分频系数为 1
// TPM0~TPM2 可任意选择 TPM_CLKIN0 /TPM_CLKIN1 来作为计数口,例如此处是 TPM2选择TPM_CLKIN0,也可以 TPM1选择TPM_CLKIN0等

tpm_pulse_clean(TPM2);                                  //清空脉冲计数器计算值(开始新的计数)

count   =  tpm_pulse_get(TPM2);                         //保存脉冲计数器计算值,返回整数

flash====================================================================================================

#define SECTOR_NUM  (FLASH_SECTOR_NUM-1)         //尽量用最后面的扇区,确保安全
uint32  data32;
uint16  data16;
uint8   data8;
flash_init();                                       //初始化flash
flash_erase_sector(SECTOR_NUM);                     //擦除扇区
if( 1 == flash_write(SECTOR_NUM, 0, 0x12345678) )   //写入数据到扇区,偏移地址为0,必须一次写入4字节
//if是用来检测是否写入成功,写入成功了就读取
{
data32 =    flash_read(SECTOR_NUM, 0, uint32);  //读取4字节
printf("一次读取32位的数据为:0x%08x\n", data32);

data16 =    flash_read(SECTOR_NUM, 0, uint16);  //读取2字节
printf("一次读取16位的数据为:0x%04x\n", data16);

data8  =    flash_read(SECTOR_NUM, 0, uint8);   //读取1字节
printf("一次读取8位的数据为:0x%02x\n", data8);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: