Exynos_4412编程实现输出占空比为2:1,波形周期为9ms的PWM波形
时间: 2023-06-20 11:03:52 浏览: 186
pwm.zip_4412 PWM_cortexA9开发板_exynos4412 pwm_site:www.pudn.com
Exynos_4412是一款基于Cortex-A9架构的处理器,具有多个定时器/计数器模块,可以用来产生PWM波形。
以下是使用定时器模块产生占空比为2:1,周期为9ms的PWM波形的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <linux/i2c-dev.h>
#include <stdbool.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <sys/mman.h>
// Exynos 4412寄存器地址定义
#define GPD0CON 0x114000A0
#define TCFG0 0x139D0000
#define TCFG1 0x139D0004
#define TCON 0x139D0008
#define TCNTB0 0x139D000C
#define TCMPB0 0x139D0010
#define TCNTO0 0x139D0014
// 映射寄存器地址到用户空间
void* mmap_register(uint32_t addr, size_t size) {
int fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
perror("failed to open /dev/mem");
exit(EXIT_FAILURE);
}
void* map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, addr & ~0xFFF);
if (map == MAP_FAILED) {
perror("failed to mmap register");
exit(EXIT_FAILURE);
}
close(fd);
return map + (addr & 0xFFF);
}
int main() {
// 映射寄存器
volatile uint32_t* gpd0con = mmap_register(GPD0CON, 0x1000);
volatile uint32_t* tcfg0 = mmap_register(TCFG0, 0x1000);
volatile uint32_t* tcfg1 = mmap_register(TCFG1, 0x1000);
volatile uint32_t* tcon = mmap_register(TCON, 0x1000);
volatile uint32_t* tcntb0 = mmap_register(TCNTB0, 0x1000);
volatile uint32_t* tcmpb0 = mmap_register(TCMPB0, 0x1000);
volatile uint32_t* tcnto0 = mmap_register(TCNTO0, 0x1000);
// 配置GPD0_0引脚为定时器PWM输出
*gpd0con = (*gpd0con & ~0xF) | 0x2;
// 配置定时器0
*tcfg0 = (*tcfg0 & ~0xFFFF) | 0xFF; // 预分频器0xFF
*tcfg1 = (*tcfg1 & ~0x7F) | 0x0; // 分频器1
*tcon = (*tcon & ~0xF) | 0x9; // 自动重载模式,定时器0启动
*tcon = (*tcon & ~0xF) | 0x1; // 定时器0停止
// 设置PWM波形周期和占空比
uint32_t period_us = 9000; // 单位:微秒
uint32_t duty_us = 4500; // 单位:微秒
uint32_t cnt = period_us * 1000 / 66; // 66ns为定时器时钟周期
*tcntb0 = cnt; // 定时器0计数器周期
*tcmpb0 = cnt * duty_us / period_us; // 定时器0比较器值
// 启动定时器0
*tcon = (*tcon & ~0xF) | 0x9; // 自动重载模式,定时器0启动
// 持续输出PWM波形
while (true) {
printf("PWM output\n");
usleep(period_us);
}
// 解除映射
munmap((void*)tcon, 0x1000);
munmap((void*)tcfg1, 0x1000);
munmap((void*)tcfg0, 0x1000);
munmap((void*)gpd0con, 0x1000);
return 0;
}
```
这段代码使用定时器模块产生PWM波形,通过映射寄存器的方式访问Exynos 4412的寄存器。其中,GPD0_0引脚被配置为PWM输出,定时器0被用来产生PWM波形。在循环中不断输出PWM波形,周期为9ms,占空比为2:1。你可以根据需要修改period_us和duty_us的值来改变PWM波形的周期和占空比。
阅读全文