欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

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

程序员文章站 2022-06-15 22:57:49
文章目录1,串口设备1.1, UART 协议1.2,uart 串口波形1.3,例2,I2C 设备2.1,I2C 协议2.1,I2C 波形3,PWM 蜂鸣器3.1,PWM 蜂鸣器3.2,配置pwm3.2.1,设置GPI/O为PWM模式3.2.2,设置pwm频率3.2.2.1,第一级分频TCFG03.2.2.2,第二级分频3.2.2.3,第三级分频3.2.3,设置占空比3.2.4,启动定时器3.3,设......

1,串口设备

1.1, UART 协议

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

1.2,uart 串口波形

发送 0xFF 0X00 0X04 0X08数据
串行通信参数设置:BAUD:115200,8位数据,1个停止位,无奇偶校验,发送顺序为低位先发送。

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

波形实现方法:

  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 (半双工 同步) 嵌入式linux-ARM体系结构及接口技术,ARM波形控制,PWM配置
支持一主机对多从机
可主从切换

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

支持一主机对多从机
可主从切换
嵌入式linux-ARM体系结构及接口技术,ARM波形控制,PWM配置 嵌入式linux-ARM体系结构及接口技术,ARM波形控制,PWM配置

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

2.1,I2C 波形

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

3,PWM 蜂鸣器

PWM(Pulse Width Modulation) :
脉冲宽度调制 。常见应用有:电机控制,DAC输出等
嵌入式linux-ARM体系结构及接口技术,ARM波形控制,PWM配置
占空比:
就是输出的PWM中,高电平保持的时间 与该PWM的时钟周期的时间之比

3.1,PWM 蜂鸣器

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

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

3.2,配置pwm

3.2.1,设置GPI/O为PWM模式

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

GPD0CON = (GPD0CON & ~(0X00F << 0)) | (0x02 << 0);  	//1.设置GPD0_0为PWM模式

3.2.2,设置pwm频率

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

3.2.2.1,第一级分频TCFG0

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

TCFG0 = (TCFG0 & ~(0XFF << 0)) | (100 << 0); 	//第一级分频100

3.2.2.2,第二级分频

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

TCFG1 = (TCFG1 & ~(0X0F << 0)) | (0x03 << 0); 	//第二级分频8

3.2.2.3,第三级分频

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

TCNTB0 = 200; 									//第三级分频200

3.2.3,设置占空比

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

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

TCMPB0 = 100; 			//3.设置占空比为50%

3.2.4,启动定时器

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

//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)
	}
}

本文地址:https://blog.csdn.net/m0_37542524/article/details/85947369