嵌入式linux-ARM体系结构及接口技术,ARM波形控制,PWM配置

2019-07-12 17:57发布

文章目录

1,串口设备

1.1, UART 协议

在这里插入图片描述

1.2,uart 串口波形

发送 0xFF 0X00 0X04 0X08数据
串行通信参数设置:BAUD:115200,8位数据,1个停止位,无奇偶校验,发送顺序为低位先发送。 在这里插入图片描述
波形实现方法:
  1. CPU 已实现,仅需设置寄存器
  2. GPIO管脚模拟波形

1.3,例

//发送0x04 数据 void uart_tx(void) { GPA1CON = GPA1CON&~0xf<<4)|(0x01<<4); //设置GPA1_1 GPIO输出模式 //开始位 GPA1DAT = GPA1DAT&~0x02 ; //设置GPA1_1 低电平 delay10ms(); //传数据 0x04 0000 0100 delay10ms(); //0 delay10ms(); //0 GPA1DAT = GPA1DAT|0x02 ; //1 delay10ms(); GPA1DAT = GPA1DAT&~0x02 ; //设置GPA1_1 低电平 delay10ms(); //0 delay10ms(); //0 delay10ms(); //0 delay10ms(); //0 //停止位 GPA1DAT = GPA1DAT|0x02 ; //1 delay10ms(); } void uart_rx(void) { unsigned char output=0; GPA1CON = GPA1CON&~0xf); //设置GPA1_1 GPIO输入模式 //检测开始位 while(1) { if(GPA1DAT&0x01==0) break; delay10ms(); } //接收数据 if(GPA1DAT&0x01==0) //bit0 output=0; else output=1; if(GPA1DAT&0x01==0) //bit1 output=output&~(0x01<<1); else output=output|(0x01<<1); if(GPA1DAT&0x01==0) //bit2 output=output&~(0x01<<2); else output=output|(0x01<<2); .... }

2,I2C 设备

2.1,I2C 协议

双线 i2c (半双工 同步) 支持一主机对多从机 可主从切换 在这里插入图片描述 支持一主机对多从机 可主从切换 在这里插入图片描述

2.1,I2C 波形

往ID为0x3c的I2C 设备写数据 0x2e 0x2e ... 1.由主机发起,在SCL为高电平时,SDA由高到低切 变,形成开始信号; 2.接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作; 3.接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了; 4.接着是两个8位数据00101110与响应,即0x2E, 5.还有其它数据和最后的停止位,图中被截掉了

3,PWM 蜂鸣器

PWM(Pulse Width Modulation) :
脉冲宽度调制 。常见应用有:电机控制,DAC输出等 占空比:
就是输出的PWM中,高电平保持的时间 与该PWM的时钟周期的时间之比

3.1,PWM 蜂鸣器

在这里插入图片描述 在这里插入图片描述

3.2,配置pwm

3.2.1,设置GPI/O为PWM模式

在这里插入图片描述
在这里插入图片描述 GPD0CON = (GPD0CON & ~(0X00F << 0)) | (0x02 << 0); //1.设置GPD0_0为PWM模式

3.2.2,设置pwm频率

在这里插入图片描述
在这里插入图片描述

3.2.2.1,第一级分频TCFG0

在这里插入图片描述 TCFG0 = (TCFG0 & ~(0XFF << 0)) | (100 << 0); //第一级分频100

3.2.2.2,第二级分频

在这里插入图片描述 TCFG1 = (TCFG1 & ~(0X0F << 0)) | (0x03 << 0); //第二级分频8

3.2.2.3,第三级分频

在这里插入图片描述 TCNTB0 = 200; //第三级分频200

3.2.3,设置占空比

在这里插入图片描述 在这里插入图片描述 TCMPB0 = 100; //3.设置占空比为50%

3.2.4,启动定时器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 //4.启动定时器 //TCON = (TCON & ~(0x0f << 0)) | (0x0b << 0); //定时器启动设置(定时器开启,波形不翻转,更新定时器初值,自动重装载) TCON = (TCON & ~(0x0f << 0)) | (0x0a << 0); //先配置,先不启动 TCON = (TCON & ~(0x0f << 0)) | (0x09 << 0); //配置好了再启动

3.4,例

#define GPD0CON (*(volatile unsigned int *)0x114000a0) // #define TCFG0 (*(volatile unsigned int *)0x139d0000) //pwm第一级分频,设置Prescaler #define TCFG1 (*(volatile unsigned int *)0x139d0004) //pwm第二级分频 #define TCNTB0 (*(volatile unsigned int *)0x139d000c) //pwm第三级分频 #define TCMPB0 (*(volatile unsigned int *)0x139d0010) //设置占空比 #define TCON (*(volatile unsigned int *)0x139d0008) //定时器启动设置(定时器开启,波形翻转,更新定时器初值,自动重装载) #define ON 1 #define OFF 2 void pwm_init() { //*********外部 配置GPIO*********************************** //1.设置GPD0_0为PWM模式 GPD0CON = (GPD0CON & ~(0X00F << 0)) | (0x02 << 0); //*********内部 配置PWN功能块*************************************** //2.设置PWM周期为625Hz TCFG0 = (TCFG0 & ~(0XFF << 0)) | (100 << 0); //第一级分频100 TCFG1 = (TCFG1 & ~(0X0F << 0)) | (0x03 << 0); //第二级分频8 TCNTB0 = 200; //第三级分频200 //3.设置占空比为50% TCMPB0 = 100; //4.启动定时器 //TCON = (TCON & ~(0x0f << 0)) | (0x0b << 0); //定时器启动设置(定时器开启,波形不翻转,更新定时器初值,自动重装载) TCON = (TCON & ~(0x0f << 0)) | (0x0a << 0); //先配置,先不启动 TCON = (TCON & ~(0x0f << 0)) | (0x09 << 0); //配置好了再启动 } void pwm_beep(int on_off) { if(on_off == ON) { TCON = (TCON & ~(0x01 << 0)) | (0x01 << 0); //启动定时器(beep) } else if(on_off == OFF) { TCON = (TCON & ~(0x01 << 0)) | (0x00 << 0); //关闭定时器(beep) } }