實驗報告書
一、實驗內(nèi)容與目的 實驗內(nèi)容: 通過對Exynos4412的PWM的操作,控制實驗箱的蜂鳴器實現(xiàn)發(fā)聲,并播放音樂。 實驗?zāi)康?/span>:
二、實驗原理與程序(原理圖、程序流程圖、程序等) PWM0_BUZZER原理圖:(底板原理圖) ? 其連接引腳XpwmTOUT0_C(底板原理圖) ? ? Exynos4412原理圖: ? 得:PWM0_BUZZER>>XpwmTOUT0_C>>GPD0_0 程序流程圖: ? 程序代碼: 驅(qū)動文件的核心代碼: ①初始化函數(shù):init static int fs4412_pwm_io_init() { ??? writel((readl(pwm->gpd0con) & ~(0xf)) | 0x2,pwm->gpd0con); ??? //設(shè)置GPD0CON控制寄存器[3:0]的值為0x2, 則TOUT0信號會輸出PWM信號。 ??? writel((readl(pwm->timer_base+TCFG0) & ~(0Xff) | 0xc7,pwm->timer_base+TCFG0); ?????? //一級分頻? 分頻值為199? 即200分頻?? 199的16進(jìn)制為0xC7 ??? writel((readl(pwm->timer_base + TCFG1) & ~(0xf) | 0x2,pwm->timer_base + TCFG1); ????? //二級分頻,選分頻值為1/2 即2分頻 ??? writel(600,pwm->timer_base+TCNTB0); ??? //pwm初值為600 ??? writel(300,pwm->timer_base+TCMPB0); ??? //pwm電平翻轉(zhuǎn)值為300 ??? writel(readl(pwm->timer_base+TCON) & ~(0xf) | 0x2,pwm->timer_base+TCON);???? ?????????????????????????????????????????????? ?????? //定時器手動更新,即加載TCNTB0 和 TCMPB0的值 ??? return 0; } ②與驅(qū)動程序相關(guān)聯(lián)的函數(shù):ioctl static long fs4412_pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { ??? int data; ??? if (_IOC_DIR(cmd) == _IOC_WRITE) ??? ??? if (copy_from_user(&data, (void *)arg, sizeof(data))) ??? ??? ??? return -EFAULT; ??? switch(cmd) ??? { ??? case PWM_ON: ??? ??? writel(readl(pwm->timer_base+TCON) & ~(0xf) | 0x9,pwm->timer_base+TCON); ??? ??? //設(shè)置寄存器TCON,使定時器開啟,并啟用自動重載 ??? ??? break; ??? case PWM_OFF: ??? ??? writel(readl(pwm->timer_base+TCON) & ~(0xf) ,pwm->timer_base+TCON); ??? ??? //設(shè)置寄存器TCON,使定時器關(guān)閉,低四位清零 ??? ??? break; ??? case SET_PRE: ??? ??? writel(readl(pwm->timer_base+TCFG0) & ~(0xff) | (data & 0xff),pwm->timer_base+TCFG0); ??? ??? //設(shè)置寄存器TCFG0的值,低八位先清零,再根據(jù)應(yīng)用程序數(shù)據(jù)傳過來的數(shù)據(jù)進(jìn)行低八位設(shè)置 ??? ??? writel(readl(pwm->timer_base+TCON) & ~(0xf) | 0x9,pwm->timer_base+TCON); ??? ??? //定時器開啟,并啟用自動重載 ??? ??? break; ??? case SET_CNT: ??? ??? writel(data,pwm->timer_base+TCNB0); ??? ??? ?//設(shè)置pwm定時器的初值TCNB0 ??? ??? writel(data/2,pwm->timer_base+TCMPB0); ??? ??? ?//設(shè)置pwm定時器的翻轉(zhuǎn)值TCMPB0 ??? ??? break; ??? } ??? return 0; } ③標(biāo)記化賦值函數(shù)(作用:提供文件系統(tǒng)入口點函數(shù),就可訪問設(shè)備驅(qū)動程序):fops static struct file_operations fs4412_pwm_fops = { ??? .owner = THIS_MODULE, ??? .open = fs4412_pwm_open, ??? .release = fs4412_pwm_rlease, ??? .unlocked_ioctl = fs4412_pwm_ioctl, }; 驅(qū)動文件Makefile文件代碼: obj-m := fs4412_pwm.o KERNELDIR := /CBT-SuperIOT/linux-3.5 default: ??? make -C $(KERNELDIR) M=$(shell pwd) modules clean: ??? rm -rf *.o? *.ko? *.mod.*?? modules.*? Mo*.* 應(yīng)用程序的核心代碼: //打開pwm定時器cmd為 PWM_ON ,入口函數(shù)int ioctl(int fd ,int cmd ) ; ioctl(dev_fd,PWD_ON); //設(shè)置pwm定時器的頻率,cmd為SET_PRE入口函數(shù)int ioctl(int fd , int cmd , char *argp ); ioctl(dev_fd,SET_PRE,&pre); while (1){ for(i = 0;i<sizeof(MotherLoveMeOnceAgain)/sizeof(Note);i++ ) { div = (PCLK/199/2)/(MotherLoveMeOnceAgain[i].pitch); //設(shè)置pwm定時器的CNT值, cmd為SET_CNT,把div作為參數(shù)傳入入口函數(shù)int ioctl(int fd , int cmd , char *argp ); ioctl(dev_fd,SET_CNT,&div); usleep(MotherLoveMeOnceAgain[i ].dimation *50); } 應(yīng)用程序Makefile文件代碼: CC = arm-linux-gcc TARGET = All OBJECT = pwm_test.o $(TARGET):$(OBJECT) ??? $(CC) $(OBJECT) -o pwm_test $(OBJECT):test_pwm.c ??? $(CC) -c test_pwm.c -o $(OBJECT) clean: ??? rm *.o pwm_test | |||||||
三、實驗操作步驟 硬件驅(qū)動編譯、加載、運(yùn)行步驟
編寫fs4412_pwm.c驅(qū)動文件在pc端的Linux系統(tǒng)下編寫 編寫驅(qū)動文件的編譯文件Makefile 使用make命令運(yùn)行Makefile文件,使fs4412_pwm.c文件生成pwm.ko的內(nèi)核模塊文件
編寫pwm_test.c驅(qū)動文件在pc端的Linux系統(tǒng)下編寫 編寫驅(qū)動文件的編譯文件Makefile,make一下 配置交叉開發(fā)環(huán)境 ①連接Cortex-A9的3根線:電源線、串口線、網(wǎng)線。 ②配置網(wǎng)絡(luò)IP地址。
③使用XShell來連接Cortex-A9,并將PC Linux系統(tǒng)下的/CBT-SuperIOT目錄掛載到Cortex-A9系統(tǒng)下的/mnt目錄下
將內(nèi)核文件加載到Linux系統(tǒng)的內(nèi)核里面:insmod adc.ko
生成設(shè)備文件mknod /dev/pwm c 500 0
進(jìn)入adc應(yīng)用程序的目錄中運(yùn)行:./pwm_test 四、實驗結(jié)果與總結(jié) 實驗結(jié)果: ???? 蜂鳴器可播放pwm_music.h文件的音樂。文章來源:http://www.zghlxwxcb.cn/news/detail-465029.html 實驗總結(jié):文章來源地址http://www.zghlxwxcb.cn/news/detail-465029.html
|
|||||||
到了這里,關(guān)于嵌入式PWM實驗報告的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!