MC9S12 底层驱动
来源:互联网 发布:人工智能芯片龙头股票 编辑:程序博客网 时间:2024/06/05 23:59
底层驱动
init.c
倍频 + 三个级联PWM(moto1 moto2 steer) + 串口中断 + 脉冲计数 + 外部中断(下降沿)
#include "All_includes.h" /* 锁相环总线倍频至80MHz fPLLCLK = 2 * fOSCCLK * (SYNR + 1) / (REFDV + 1) */ void initPLL(void){ SYNR = 0X09; SYNR |= 0XC0; REFDV = 0X01; REFDV |= 0X80; POSTDIV = 0X00; asm nop; asm nop; asm nop; while((CRGFLG & 0X08) ==0); CLKSEL &= 0X7F; CLKSEL |= 0X80; } //IO初始化 数据采集 拨码开关 void initIO(void) { DDRA_DDRA0 = 1; //trigH PORTA_PA0 = 0; DDRA_DDRA1 = 1; //trigT PORTA_PA1 = 0; //设置H口0位的中断 //EchoH DDRP_DDRP0 = 0; //P口0位:开关量输入 读数据! PERP_PERP0 = 0; //P口0位:允许上拉或下拉器件 PPSP_PPSP0 = 0; //P口0位:1上升沿触发中断 0下降沿 PIEP_PIEP0=1; DDRP_DDRP1 = 0; PERP_PERP1 = 0; PPSP_PPSP1 = 0; PIEP_PIEP1 = 1; //H口0位:中断允许 中断标志位 PIFP_PIFP0 } void initSteer01(void) //舵机PWM初始化 { PWMCTL_CON01 =1; //0,1通道级联 PWMCLK_PCLK1 =1; //选择 PWM7口的时钟源为Clock SA ;若置为0,则时钟源为Clock A PWMPRCLK_PCKA =3; //ClockA=总线时钟/8 即10MHz PWMSCLA =5; //ClockSA=ClockA/(2*PWMSCLA)=5MHZ PWMPOL_PPOL1 =1; //设置通道1 PWM波的一个周期开始时是高电平 PWMCAE_CAE1 =0; //通道1 PWM输出左对齐 PWMPER01 =10000; //设置PWM频率,PWM1 Frequency = Clock SA / PWMPER01;初始值为 100Hz PWME_PWME1 =1; //使能PWM1 PWMDTY01 =1560; //舵机回中 } //****************************PWM初始化********************* //ClockSB =ClockB/(2*PWMSCLB) //0 1 4 5-->A SA //2 3 6 7-->B SB //输出频率 =CLK/PWMPERx (左对齐方式) //输出频率 =CLK/2*PWMPERx (中心对齐方式) /* PWMDTY23 = pwm; PWMDTY45 = 0 正转 PWMDTY23 = pwm; PWMDTY45 = 1000 正转 */ void initMoto23(void) //电机PWM初始化 { PWMCTL_CON23 =1; //2,3通道级联为16位PWM 对3的设置有效 2无效 级联 PWMCLK_PCLK3 =1; //PWM3(16位) 选择 ClockSB 时钟 PWMPRCLK_PCKB =3; //ClockSB=总线时钟/(2^3) 即10MHz 分频 PWMSCLB =5; //ClockSB=ClockB/(2*PWMSCLB)=1MHZ 置频?? PWMPOL_PPOL3 =1; //设置通道3 PWM波的一个周期开始时是高电平 // PWMCAE_CAE3 =1; //通道3 PWM输出左对齐 PWMPER23 =1000; //设置PWM频率 PWM3 f=ClockSB/PWMPER23 = 1000HZ PWME_PWME3 =1; //使能PWM3 PWMDTY23 =0; //设置初值刹车 } void initMoto45(void) //电机PWM初始化 { PWMCTL_CON45 =1; //4,5通道级联 PWMCLK_PCLK5 =1; //PWM5 选择 ClockSA PWMPRCLK_PCKA =3; //ClockSA=总线时钟/8 即10MHz PWMSCLA =5; //ClockSA=ClockA/(2*PWMSCLA)=1MHZ PWMPOL_PPOL5 =1; //设置通道5 PWM波的一个周期开始时是高电平 // PWMCAE_CAE5 =1; //通道5 PWM输出左对齐 PWMPER45 =1000; //设置PWM频率 PWM5 f=ClockSA/PWMPER45 = 1000HZ PWME_PWME5 =1; //使能PWM5 PWMDTY45 =0; //设置初值刹车 } //脉冲累加器初始化 编码器? /* void initCnt(void) { PACTL =0X50; //PT7上升沿脉冲计数 TCTL3_EDG7B =0; TCTL3_EDG7A =1; //输入捕捉上升沿 TIE_C7I =0; //通道中断屏蔽 TIOS_IOS7 =0; //输入捕捉 PACNT =0X00; //计数器清零 } */ //串口初始化 void initSCI0(void) //初始化SCI0模块 { //SCI0BD =43; //总线频率80M 波特率=MCLK/(16*BR)=80M/(16*43)=116379~115200 SCI0BD =521; //总线频率80M 波特率=MCLK/(16*BR)=80M/(16*521)=9597 SCI0CR1 =0x00; //7:LOOPS=0 6:SCISWAI=0 5:RSRC=0 4:M=0 3:WAKE=0 2:ILT=0 1:PE=0 0:PT=0 SCI0CR2 =0x0C; //7:TIE=0 6:TCIE=0 5:RIE=0 4:ILIE=0 3:TE=1 2:RE =1 1:RWU=0 0:SBK=0 } void initSCI0irq(void) { SCI0BD = 521; SCI0CR1 = 0x00; SCI0CR2 = 0x2C; }void SCI_putchar(byte ch) { if (ch =='\n') {while(!(SCI0SR1&0x80)); SCI0DRL= 0x0d; //输出回车return;}while(!(SCI0SR1&0x80)); //等待发送数据寄存器为空 SCI0DRL=ch;}/////////////通过SCI传送字符串///////////////void SCI_putstr(byte ch[]) { byte ptr=0;while(ch[ptr]){SCI_putchar((byte)ch[ptr++]);} }//////////////向上位机发图像/////////////////void send_image(void) { char m,n;SCI_putstr(Image);SCI_putchar(ROW);SCI_putchar(COL);SCI_putchar(real_row);for(m=0;m<ROW;m++)SCI_putchar(path[m]);for(m=0;m<ROW;m++)SCI_putchar(pathLeft[m]);for(m=0;m<ROW;m++)SCI_putchar(pathRight[m]);for(m=0;m<ROW;m++) {for(n=0;n<COL;n++) {while(!SCI0SR1_TDRE);SCI0DRL=value[m][n];} } SCI_putstr(end);}
- MC9S12 底层驱动
- MC9S12(x)
- Android Wifi驱动--底层
- 音频底层驱动
- Android Wifi驱动--底层
- 音频底层驱动
- Android Wifi驱动--底层
- STM32 PWM底层驱动
- Android Wifi驱动--底层
- MC9S12芯片知识相关
- MC9S12相关模块
- QuickTest底层VB脚本驱动
- Android 开发 --- 底层驱动开发
- Linux TTY驱动--Uart_driver底层
- binder机制底层驱动浅析
- 创建 IRP 给底层驱动
- Linux TTY驱动--Uart_driver底层
- Linux TTY驱动--Uart_driver底层
- windows平台修改libnfc 1.7.0使其支持pn532_uart模块
- 如何从jar包中检索特定规则的代码
- android85--两个Activity之间怎么传递数据?
- 第六周项目2-2
- android86--Parcelable 和Serializable
- MC9S12 底层驱动
- 数据结构之二叉查找树
- 鸟哥的Linux私房菜基础学习篇(第三版)之第十一章:认识与学习BASH
- android87--
- android88--
- 一个注册类可以生成Myeclipse注册码.
- 指针类型作为成员函数的参数
- 二进制数中1的个数
- ABAP 单位转化