Freescale MKL26Z256xxx4初始化模板

来源:互联网 发布:从淘宝网上买劲霸男装 编辑:程序博客网 时间:2024/05/21 17:21
IAR配置:工程选项--通用选项:型号 Freescale MKL26Z256xxx4库设置:library 选 fullC/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定义符号DEBUGMKL26Z4ARM_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延时: 1000mspit_delay_ms(PIT0, 1000);                           //使用PIT0延时: 1000mssystick_delay_ms(1000);                             //使用SysTick延时: 1000msGPIO配置=============================================================================================================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,转换为十进制为9GPIO_GET_NBIT(4,PTD4);  //获取4~7电平内置LED控制函数======================================================================================================LED的对应引脚为:PTD4,PTD5,PTD6,PTD7led_init(LED0);  //初始化PTD4为LED0led(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; //定义消息结构体,名为keymsgkey_init(KEY_MAX); //初始化8个按键lptmr_timing_ms(10);    // LPTMR 定时 10msset_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、PTE22uart_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进入ifUART中断用法: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    PTE30dac_init(DAC0);result =(uint16) (((sin(val)+1.0)/2.0 )    *((1<<12) - 1));//sin 的取值范围是 -1 ~ 1 ,加1 后变成 0~2 ,再 除以 2 确保范围在 0~1 之间,DAC 是 12bitdac_out(DAC0, result);                      //输出 DAC ,可通过示波器看到正弦波LPTMR定时中断=========================================================================================================lptmr_timing_ms(1000);                                  //初始化LPTMR,定时时间为: 1000msset_vector_handler(LPTMR_VECTORn ,LPTMR_IRQHandler);    //设置LPTMR的中断服务函数为 LPTMR_IRQHandlerenable_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,      // PTA19LPT0_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,定时时间为: 1000msset_vector_handler(PIT_VECTORn ,PIT_IRQHandler);       //设置PIT0的中断服务函数为 PIT_IRQHandlerenable_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_IRQHandlervoid 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 对应为 PTE30tpm_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、PTE23TPM脉冲计数=============================================================================================================引脚定义:#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();                                       //初始化flashflash_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);    }

0 0