ARM程序設(shè)計題目與復(fù)習(xí)(共12頁)_第1頁
ARM程序設(shè)計題目與復(fù)習(xí)(共12頁)_第2頁
ARM程序設(shè)計題目與復(fù)習(xí)(共12頁)_第3頁
ARM程序設(shè)計題目與復(fù)習(xí)(共12頁)_第4頁
ARM程序設(shè)計題目與復(fù)習(xí)(共12頁)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上紅色的是我加上的程序或改過的程序,黑色的是光盤原版程序試配置STM32系統(tǒng)的主控時鐘配置成24M的例子。/系統(tǒng)時鐘初始化函數(shù)/pll:選擇的倍頻數(shù),從2開始,最大值為16void Stm32_Clock_Init(u8 PLL)unsigned char temp=0; MYRCC_DeInit(); /復(fù)位并配置向量表 RCC->CR|=0x; /外部高速時鐘使能HSEONwhile(!(RCC->CR>>17);/等待外部時鐘就緒RCC->CFGR=0X; /APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL-=2;/抵

2、消2個單位RCC->CFGR|=PLL<<18; /設(shè)置PLL值 216RCC->CFGR|=1<<16; /PLLSRC ON FLASH->ACR|=0x32; /FLASH 2個延時周期RCC->CR|=0x; /PLLONwhile(!(RCC->CR>>25);/等待PLL鎖定RCC->CFGR|=0x;/PLL作為系統(tǒng)時鐘 while(temp!=0x02) /等待PLL作為系統(tǒng)時鐘設(shè)置成功 temp=RCC->CFGR>>2;temp&=0x03; int main(void) St

3、m32_Clock_Init(3);/系統(tǒng)時鐘設(shè)置編寫程序外部通道輸入一個電壓,并用ADC的DMA模式采樣100個數(shù)據(jù),然后用UART將ADC采樣的100個電壓數(shù)據(jù)傳輸?shù)诫娔X上。void Adc_Init(void) /先初始化IO口 RCC->APB2ENR|=1<<2; /使能PORTA口時鐘 GPIOA->CRL&=0XFFFFFF0F;/PA1 anolog輸入/通道10/11設(shè)置 RCC->APB2ENR|=1<<9; /ADC1時鐘使能 RCC->APB2RSTR|=1<<9; /ADC1復(fù)位RCC->APB

4、2RSTR&=(1<<9);/復(fù)位結(jié)束 RCC->CFGR&=(3<<14); /分頻因子清零/SYSCLK/DIV2=12M ADC時鐘設(shè)置為12M,ADC最大時鐘不能超過14M!/否則將導(dǎo)致ADC準(zhǔn)確度下降! RCC->CFGR|=2<<14; ADC1->CR1&=0XF0FFFF; /工作模式清零ADC1->CR1|=0<<16; /獨立工作模式 ADC1->CR1&=(1<<8); /非掃描模式 ADC1->CR2&=(1<<1); /單

5、次轉(zhuǎn)換模式ADC1->CR2&=(7<<17); ADC1->CR2|=7<<17; /軟件控制轉(zhuǎn)換 ADC1->CR2|=1<<20; /使用用外部觸發(fā)(SWSTART)!必須使用一個事件來觸發(fā)ADC1->CR2|=1<<8; /使用DMAADC1->CR2&=(1<<11); /右對齊 ADC1->SQR1&=(0XF<<20);ADC1->SQR1|=0<<20; /1個轉(zhuǎn)換在規(guī)則序列中 也就是只轉(zhuǎn)換規(guī)則序列1 /設(shè)置通道1的采樣時間ADC

6、1->SMPR2&=(7<<3); /通道1采樣時間清空 ADC1->SMPR2|=7<<3; /通道1 239.5周期,提高采樣時間可以提高精確度 ADC1->CR2|=1<<0; /開啟AD轉(zhuǎn)換器 ADC1->CR2|=1<<3; /使能復(fù)位校準(zhǔn) while(ADC1->CR2&1<<3); /等待校準(zhǔn)結(jié)束 /該位由軟件設(shè)置并由硬件清除。在校準(zhǔn)寄存器被初始化后該位將被清除。 ADC1->CR2|=1<<2; /開啟AD校準(zhǔn) while(ADC1->CR2&

7、;1<<2); /等待校準(zhǔn)結(jié)束/該位由軟件設(shè)置以開始校準(zhǔn),并在校準(zhǔn)結(jié)束時由硬件清除 /獲取通道ch的轉(zhuǎn)換值,取times次,然后平均 /ch:通道編號/times:獲取次數(shù)/返回值:通道ch的times次轉(zhuǎn)換結(jié)果平均值u16 Get_Adc_Average(u8 ch,u8 times)u32 temp_val=0;u8 t;for(t=0;t<times;t+)temp_val+=Get_Adc(ch);delay_ms(5);return temp_val/times;/pclk2:PCLK2時鐘頻率(Mhz)/bound:波特率void uart_init(u32 pc

8、lk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*)/(bound*16);/得到USARTDIVmantissa=temp; /得到整數(shù)部分fraction=(temp-mantissa)*16; /得到小數(shù)部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能PORTA口時鐘 RCC->APB2ENR|=1<<14; /使能串口時鐘 GPIOA->CRH&=0XFFFFF0

9、0F;/IO狀態(tài)設(shè)置GPIOA->CRH|=0XB0;/IO狀態(tài)設(shè)置 RCC->APB2RSTR|=1<<14; /復(fù)位串口1RCC->APB2RSTR&=(1<<14);/停止復(fù)位 /波特率設(shè)置 USART1->BRR=mantissa; / 波特率設(shè)置 USART1->CR1|=0X200C; /1位停止,無校驗位.#if EN_USART1_RX /如果使能了接收/使能接收中斷USART1->CR1|=1<<8; /PE中斷使能USART1->CR1|=1<<5; /接收緩沖區(qū)非空中斷使能

10、MY_NVIC_Init(3,3,USART1_IRQChannel,2);/組2,最低優(yōu)先級 #endif#include "sys.h"#include "usart.h"#include "delay.h"#include "adc.h" int main(void)u16 adcx,i; Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置uart_init(72,9600); /串口初始化為9600delay_init(72); /延時初始化 Adc_Init(); /ADC初始化 while(1) f

11、or(i=0;i<100;i+)/采集100個數(shù)據(jù),循環(huán)100次 adcx=Get_Adc_Average(ADC_CH1,10);/轉(zhuǎn)換一次USART1->DR=adcx;/把數(shù)據(jù)送到發(fā)送緩存區(qū)while(USART1->SR&(1<<6)=0);/等待發(fā)送完成USART1->SR&=(1<<6); / 清除標(biāo)志位 GPIO口實現(xiàn)LED1燈以0.1s閃爍2s。/初始化PB5和PE5為輸出口.并使能這兩個口的時鐘 /LED IO初始化void LED_Init(void)RCC->APB2ENR|=1<<3; /

12、使能PORTB時鐘 RCC->APB2ENR|=1<<6; /使能PORTE時鐘 GPIOB->CRL&=0XFF0FFFFF; GPIOB->CRL|=0X;/PB.5 推挽輸出 GPIOB->ODR|=1<<5; /PB.5 輸出高 GPIOE->CRL&=0XFF0FFFFF;GPIOE->CRL|=0X;/PE.5推挽輸出GPIOE->ODR|=1<<5; /PE.5輸出高 /通用定時器3中斷初始化/這里時鐘選擇為APB1的2倍,而APB1為36M/arr:自動重裝值。/psc:時鐘預(yù)分頻數(shù)/

13、這里使用的是定時器3!void TIM3_Int_Init(u16 arr,u16 psc)RCC->APB1ENR|=1<<1;/TIM3時鐘使能 TIM3->ARR=arr; /設(shè)定計數(shù)器自動重裝值/剛好1ms TIM3->PSC=psc; /預(yù)分頻器7200,得到10Khz的計數(shù)時鐘 TIM3->DIER|=1<<0; /允許更新中斷 TIM3->CR1|=0x01; /使能定時器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/搶占1,子優(yōu)先級3,組2 #include "sys.h"

14、#include "timer.h"#include "led.h" int main(void) Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置 LED_Init();TIM3_Int_Init(499,7199);/10Khz的計數(shù)頻率,計數(shù)500次為0.05s while(1) u16 c=40;/定義40次,正好是2svoid TIM3_IRQHandler(void) if(TIM3->SR&0X0001)/溢出中斷 if(c) LED1=!LED1; c-; TIM3->SR&=(1<<0);/

15、清除中斷標(biāo)志位 PWM/TIM3 PWM部分初始化 /PWM輸出初始化/arr:自動重裝值/psc:時鐘預(yù)分頻數(shù)void TIM3_PWM_Init(u16 arr,u16 psc) /此部分需手動修改IO口設(shè)置RCC->APB1ENR|=1<<1; /TIM3時鐘使能 RCC->APB2ENR|=1<<3; /使能PORTB時鐘GPIOB->CRL&=0XFF0FFFFF;/PB5輸出GPIOB->CRL|=0X00B00000;/復(fù)用功能輸出 RCC->APB2ENR|=1<<0; /開啟輔助時鐘 AFIO->

16、MAPR&=0XFFFFF3FF; /清除MAPR的11:10AFIO->MAPR|=1<<11; /部分重映像,TIM3_CH2->PB5TIM3->ARR=arr;/設(shè)定計數(shù)器自動重裝值 TIM3->PSC=psc;/預(yù)分頻器不分頻TIM3->CCMR1|=7<<12; /CH2 PWM2模式 TIM3->CCMR1|=1<<11; /CH2預(yù)裝載使能 TIM3->CCER|=1<<4; /OC2 輸出使能 TIM3->CR1=0x0080; /ARPE使能 TIM3->CR1|=

17、0x01; /使能定時器3 #include "sys.h" #include "timer.h" int main(void) Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置 TIM3_PWM_Init(899,0);/不分頻。PWM頻率=72000/(899+1)=80KhzTIM3->CCR2=200;/占空比賦值 while(1) CAN/CAN初始化/tsjw:重新同步跳躍時間單元.范圍:13;/tbs2:時間段2的時間單元.范圍:18;/tbs1:時間段1的時間單元.范圍:116;/brp :波特率分頻器.范圍:11024;(實

18、際要加1,也就是11024) tq=(brp)*tpclk1/注意以上參數(shù)任何一個都不能設(shè)為0,否則會亂./波特率=Fpclk1/(tbs1+tbs2+1)*brp);/mode:0,普通模式;1,回環(huán)模式;/Fpclk1的時鐘在初始化的時候設(shè)置為36M,如果設(shè)置CAN_Normal_Init(1,8,7,5,1);/則波特率為:36M/(8+7+1)*5)=450Kbps/返回值:0,初始化OK;/ 其他,初始化失敗;u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)u16 i=0; if(tsjw=0|tbs2=0|tbs1=

19、0|brp=0)return 1;tsjw-=1;/先減去1.再用于設(shè)置tbs2-=1;tbs1-=1;brp-=1;RCC->APB2ENR|=1<<2; /使能PORTA時鐘 GPIOA->CRH&=0XFFF00FFF; GPIOA->CRH|=0X000B8000;/PA11 RX,PA12 TX推挽輸出 GPIOA->ODR|=3<<11; RCC->APB1ENR|=1<<25;/使能CAN時鐘 CAN使用的是APB1的時鐘(max:36M)CAN->MCR=0x0000;/退出睡眠模式(同時設(shè)置所有位

20、為0)CAN->MCR|=1<<0;/請求CAN進(jìn)入初始化模式while(CAN->MSR&1<<0)=0)i+;if(i>100)return 2;/進(jìn)入初始化模式失敗CAN->MCR|=0<<7;/非時間觸發(fā)通信模式CAN->MCR|=0<<6;/軟件自動離線管理CAN->MCR|=0<<5;/睡眠模式通過軟件喚醒(清除CAN->MCR的SLEEP位)CAN->MCR|=1<<4;/禁止報文自動傳送CAN->MCR|=0<<3;/報文不鎖定,新的

21、覆蓋舊的CAN->MCR|=0<<2;/優(yōu)先級由報文標(biāo)識符決定CAN->BTR=0x;/清除原來的設(shè)置.CAN->BTR|=mode<<30;/模式設(shè)置 0,普通模式;1,回環(huán)模式;CAN->BTR|=tsjw<<24; /重新同步跳躍寬度(Tsjw)為tsjw+1個時間單位CAN->BTR|=tbs2<<20; /Tbs2=tbs2+1個時間單位CAN->BTR|=tbs1<<16;/Tbs1=tbs1+1個時間單位CAN->BTR|=brp<<0; /分頻系數(shù)(Fdiv)為br

22、p+1/波特率:Fpclk1/(Tbs1+Tbs2+1)*Fdiv)CAN->MCR&=(1<<0);/請求CAN退出初始化模式while(CAN->MSR&1<<0)=1)i+;if(i>0XFFF0)return 3;/退出初始化模式失敗/過濾器初始化CAN->FMR|=1<<0;/過濾器組工作在初始化模式CAN->FA1R&=(1<<0);/過濾器0不激活CAN->FS1R|=1<<0; /過濾器位寬為32位.CAN->FM1R|=0<<0;/過濾器0

23、工作在標(biāo)識符屏蔽位模式CAN->FFA1R|=0<<0;/過濾器0關(guān)聯(lián)到FIFO0CAN->sFilterRegister0.FR1=0X;/32位IDCAN->sFilterRegister0.FR2=0X;/32位MASKCAN->FA1R|=1<<0;/激活過濾器0CAN->FMR&=0<<0;/過濾器組進(jìn)入正常模式#if CAN_RX0_INT_ENABLE /使用中斷接收CAN->IER|=1<<1;/FIFO0消息掛號中斷允許. MY_NVIC_Init(1,0,USB_LP_CAN_RX0

24、_IRQChannel,2);/組2#endifreturn 0; /id:標(biāo)準(zhǔn)ID(11位)/擴(kuò)展ID(11位+18位) /ide:0,標(biāo)準(zhǔn)幀;1,擴(kuò)展幀/rtr:0,數(shù)據(jù)幀;1,遠(yuǎn)程幀/len:要發(fā)送的數(shù)據(jù)長度(固定為8個字節(jié),在時間觸發(fā)模式下,有效數(shù)據(jù)為6個字節(jié))/*dat:數(shù)據(jù)指針./返回值:03,郵箱編號.0XFF,無有效郵箱.u8 Can_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat) u8 mbox; if(CAN->TSR&(1<<26)mbox=0;/郵箱0為空else if(CAN->TSR&(

25、1<<27)mbox=1;/郵箱1為空else if(CAN->TSR&(1<<28)mbox=2;/郵箱2為空else return 0XFF;/無空郵箱,無法發(fā)送 CAN->sTxMailBoxmbox.TIR=0;/清除之前的設(shè)置if(ide=0)/標(biāo)準(zhǔn)幀id&=0x7ff;/取低11位stdidid<<=21; else/擴(kuò)展幀id&=0X1FFFFFFF;/取低32位extidid<<=3; CAN->sTxMailBoxmbox.TIR|=id; CAN->sTxMailBoxmbox.

26、TIR|=ide<<2; CAN->sTxMailBoxmbox.TIR|=rtr<<1;len&=0X0F;/得到低四位CAN->sTxMailBoxmbox.TDTR&=(0XF);CAN->sTxMailBoxmbox.TDTR|=len; /設(shè)置DLC./待發(fā)送數(shù)據(jù)存入郵箱.CAN->sTxMailBoxmbox.TDHR=(u32)dat7<<24)|(u32)dat6<<16)| (u32)dat5<<8)|(u32)dat4);CAN->sTxMailBoxmbox.TDLR

27、=(u32)dat3<<24)|(u32)dat2<<16)| (u32)dat1<<8)|(u32)dat0);CAN->sTxMailBoxmbox.TIR|=1<<0; /請求發(fā)送郵箱數(shù)據(jù)return mbox;/接收數(shù)據(jù)/fifox:郵箱號/id:標(biāo)準(zhǔn)ID(11位)/擴(kuò)展ID(11位+18位) /ide:0,標(biāo)準(zhǔn)幀;1,擴(kuò)展幀/rtr:0,數(shù)據(jù)幀;1,遠(yuǎn)程幀/len:接收到的數(shù)據(jù)長度(固定為8個字節(jié),在時間觸發(fā)模式下,有效數(shù)據(jù)為6個字節(jié))/dat:數(shù)據(jù)緩存區(qū)void Can_Rx_Msg(u8 fifox,u32 *id,u8 *i

28、de,u8 *rtr,u8 *len,u8 *dat) *ide=CAN->sFIFOMailBoxfifox.RIR&0x04;/得到標(biāo)識符選擇位的值 if(*ide=0)/標(biāo)準(zhǔn)標(biāo)識符*id=CAN->sFIFOMailBoxfifox.RIR>>21;else /擴(kuò)展標(biāo)識符*id=CAN->sFIFOMailBoxfifox.RIR>>3;*rtr=CAN->sFIFOMailBoxfifox.RIR&0x02;/得到遠(yuǎn)程發(fā)送請求值.*len=CAN->sFIFOMailBoxfifox.RDTR&0x0F;/得

29、到DLC /*fmi=(CAN->sFIFOMailBoxFIFONumber.RDTR>>8)&0xFF;/得到FMI/接收數(shù)據(jù)dat0=CAN->sFIFOMailBoxfifox.RDLR&0XFF;dat1=(CAN->sFIFOMailBoxfifox.RDLR>>8)&0XFF;dat2=(CAN->sFIFOMailBoxfifox.RDLR>>16)&0XFF;dat3=(CAN->sFIFOMailBoxfifox.RDLR>>24)&0XFF; dat4=C

30、AN->sFIFOMailBoxfifox.RDHR&0XFF;dat5=(CAN->sFIFOMailBoxfifox.RDHR>>8)&0XFF;dat6=(CAN->sFIFOMailBoxfifox.RDHR>>16)&0XFF;dat7=(CAN->sFIFOMailBoxfifox.RDHR>>24)&0XFF; if(fifox=0)CAN->RF0R|=0X20;/釋放FIFO0郵箱else if(fifox=1)CAN->RF1R|=0X20;/釋放FIFO1郵箱 /按鍵初

31、始化函數(shù)void KEY_Init(void)RCC->APB2ENR|=1<<2; /使能PORTA時鐘RCC->APB2ENR|=1<<6; /使能PORTE時鐘GPIOA->CRL&=0XFFFFFFF0;/PA0設(shè)置成輸入,默認(rèn)下拉 GPIOA->CRL|=0X; GPIOE->CRL&=0XFFF000FF;/PE24設(shè)置成輸入 GPIOE->CRL|=0X; GPIOE->ODR|=7<<2; /PE24 上拉 /按鍵處理函數(shù)/返回按鍵值/mode:0,不支持連續(xù)按;1,支持連續(xù)按;/0,

32、沒有任何按鍵按下/1,KEY0按下/2,KEY1按下/3,KEY2按下 /4,KEY3按下 WK_UP/注意此函數(shù)有響應(yīng)優(yōu)先級,KEY0>KEY1>KEY2>KEY3!u8 KEY_Scan(u8 mode) static u8 key_up=1;/按鍵按松開標(biāo)志if(mode)key_up=1; /支持連按 if(key_up&&(KEY0=0|KEY1=0|KEY2=0|KEY3=1)delay_ms(10);/去抖動 key_up=0;if(KEY0=0)return 1;else if(KEY1=0)return 2;else if(KEY2=0)re

33、turn 3;else if(KEY3=1)return 4;else if(KEY0=1&&KEY1=1&&KEY2=1&&KEY3=0)key_up=1; return 0;/ 無按鍵按下#include "sys.h"#include "delay.h" #include "key.h" #include "lcd.h" #include "can.h" /ALIENTEK戰(zhàn)艦STM32開發(fā)板實驗25/CAN 實驗 /技術(shù)支持:/廣州市星翼電

34、子科技有限公司 int main(void)u8 key;u8 i=0,t=0;u8 cnt=0;u8 canbuf8;u8 res;u8 mode=1;/CAN工作模式;0,普通模式;1,環(huán)回模式 Stm32_Clock_Init(9);/系統(tǒng)時鐘設(shè)置uart_init(72,9600); /串口初始化為9600delay_init(72); /延時初始化 /初始化與LED連接的硬件接口LCD_Init(); /初始化LCDKEY_Init();/按鍵初始化 CAN_Mode_Init(1,8,7,5,mode);/CAN初始化,波特率450Kbps POINT_COLOR=RED;/設(shè)置字

35、體為紅色 LCD_ShowString(60,50,200,16,16,"WarShip STM32");LCD_ShowString(60,70,200,16,16,"CAN TEST");LCD_ShowString(60,90,200,16,16,"ATOMALIENTEK");LCD_ShowString(60,110,200,16,16,"2012/9/11");LCD_ShowString(60,130,200,16,16,"LoopBack Mode"); LCD_ShowString(60,150,200,16,16,"KEY0:Send WK_UP:Mode");/顯示提示信息 POINT_COLOR=BLUE;/設(shè)置字體為藍(lán)色 LCD_ShowString(60,170,200,16,16,"Count:&q

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論