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); }
相关文章推荐
- L3G4200D + ADXL345 卡尔曼滤波
- 极酷阳光兼容手机播放代码
- iOS view模糊背景
- pthread_mutex_timedlock
- java中gui编程ActionListener和itemListener
- 把在程序中的System.out.print()的信息自动转成log4j日志信息
- 数据结构基础(5)--C语言实现循环队列--静态
- JS方法代理
- mysql索引简介
- Jabber/XMPP协议与架构
- Oracle、MySql、SQLServer 数据分页查询
- 一个基于ATMEGA128的直流电机抱死程序(转)
- Jquery EasyUI +Ajax +Json +一般处理程序 实现数据的前台与后台的交互 --- 善良公社项目
- G94 时间到数进给数
- android基本界面控件
- CodeForces #308 Div2 E(552E Vanya and Brackets)
- 网站收藏
- CSDN兑换的4本书收到了,还不错
- 支持向量机
- iOS CAGradientLayer 颜色渐变