ARM程序设计题目与复习(共12页)_第1页
ARM程序设计题目与复习(共12页)_第2页
ARM程序设计题目与复习(共12页)_第3页
ARM程序设计题目与复习(共12页)_第4页
ARM程序设计题目与复习(共12页)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上红色的是我加上的程序或改过的程序,黑色的是光盘原版程序试配置STM32系统的主控时钟配置成24M的例子。/系统时钟初始化函数/pll:选择的倍频数,从2开始,最大值为16void Stm32_Clock_Init(u8 PLL)unsigned char temp=0; MYRCC_DeInit(); /复位并配置向量表 RCC->CR|=0x; /外部高速时钟使能HSEONwhile(!(RCC->CR>>17);/等待外部时钟就绪RCC->CFGR=0X; /APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL-=2;/抵

2、消2个单位RCC->CFGR|=PLL<<18; /设置PLL值 216RCC->CFGR|=1<<16; /PLLSRC ON FLASH->ACR|=0x32; /FLASH 2个延时周期RCC->CR|=0x; /PLLONwhile(!(RCC->CR>>25);/等待PLL锁定RCC->CFGR|=0x;/PLL作为系统时钟 while(temp!=0x02) /等待PLL作为系统时钟设置成功 temp=RCC->CFGR>>2;temp&=0x03; int main(void) St

3、m32_Clock_Init(3);/系统时钟设置编写程序外部通道输入一个电压,并用ADC的DMA模式采样100个数据,然后用UART将ADC采样的100个电压数据传输到电脑上。void Adc_Init(void) /先初始化IO口 RCC->APB2ENR|=1<<2; /使能PORTA口时钟 GPIOA->CRL&=0XFFFFFF0F;/PA1 anolog输入/通道10/11设置 RCC->APB2ENR|=1<<9; /ADC1时钟使能 RCC->APB2RSTR|=1<<9; /ADC1复位RCC->APB

4、2RSTR&=(1<<9);/复位结束 RCC->CFGR&=(3<<14); /分频因子清零/SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!/否则将导致ADC准确度下降! RCC->CFGR|=2<<14; ADC1->CR1&=0XF0FFFF; /工作模式清零ADC1->CR1|=0<<16; /独立工作模式 ADC1->CR1&=(1<<8); /非扫描模式 ADC1->CR2&=(1<<1); /单

5、次转换模式ADC1->CR2&=(7<<17); ADC1->CR2|=7<<17; /软件控制转换 ADC1->CR2|=1<<20; /使用用外部触发(SWSTART)!必须使用一个事件来触发ADC1->CR2|=1<<8; /使用DMAADC1->CR2&=(1<<11); /右对齐 ADC1->SQR1&=(0XF<<20);ADC1->SQR1|=0<<20; /1个转换在规则序列中 也就是只转换规则序列1 /设置通道1的采样时间ADC

6、1->SMPR2&=(7<<3); /通道1采样时间清空 ADC1->SMPR2|=7<<3; /通道1 239.5周期,提高采样时间可以提高精确度 ADC1->CR2|=1<<0; /开启AD转换器 ADC1->CR2|=1<<3; /使能复位校准 while(ADC1->CR2&1<<3); /等待校准结束 /该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。 ADC1->CR2|=1<<2; /开启AD校准 while(ADC1->CR2&

7、;1<<2); /等待校准结束/该位由软件设置以开始校准,并在校准结束时由硬件清除 /获取通道ch的转换值,取times次,然后平均 /ch:通道编号/times:获取次数/返回值:通道ch的times次转换结果平均值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; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分 mantissa<<=4;mantissa+=fraction; RCC->APB2ENR|=1<<2; /使能PORTA口时钟 RCC->APB2ENR|=1<<14; /使能串口时钟 GPIOA->CRH&=0XFFFFF0

9、0F;/IO状态设置GPIOA->CRH|=0XB0;/IO状态设置 RCC->APB2RSTR|=1<<14; /复位串口1RCC->APB2RSTR&=(1<<14);/停止复位 /波特率设置 USART1->BRR=mantissa; / 波特率设置 USART1->CR1|=0X200C; /1位停止,无校验位.#if EN_USART1_RX /如果使能了接收/使能接收中断USART1->CR1|=1<<8; /PE中断使能USART1->CR1|=1<<5; /接收缓冲区非空中断使能

10、MY_NVIC_Init(3,3,USART1_IRQChannel,2);/组2,最低优先级 #endif#include "sys.h"#include "usart.h"#include "delay.h"#include "adc.h" int main(void)u16 adcx,i; Stm32_Clock_Init(9);/系统时钟设置uart_init(72,9600); /串口初始化为9600delay_init(72); /延时初始化 Adc_Init(); /ADC初始化 while(1) f

11、or(i=0;i<100;i+)/采集100个数据,循环100次 adcx=Get_Adc_Average(ADC_CH1,10);/转换一次USART1->DR=adcx;/把数据送到发送缓存区while(USART1->SR&(1<<6)=0);/等待发送完成USART1->SR&=(1<<6); / 清除标志位 GPIO口实现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:时钟预分频数/

13、这里使用的是定时器3!void TIM3_Int_Init(u16 arr,u16 psc)RCC->APB1ENR|=1<<1;/TIM3时钟使能 TIM3->ARR=arr; /设定计数器自动重装值/刚好1ms TIM3->PSC=psc; /预分频器7200,得到10Khz的计数时钟 TIM3->DIER|=1<<0; /允许更新中断 TIM3->CR1|=0x01; /使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占1,子优先级3,组2 #include "sys.h"

14、#include "timer.h"#include "led.h" int main(void) Stm32_Clock_Init(9);/系统时钟设置 LED_Init();TIM3_Int_Init(499,7199);/10Khz的计数频率,计数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、清除中断标志位 PWM/TIM3 PWM部分初始化 /PWM输出初始化/arr:自动重装值/psc:时钟预分频数void TIM3_PWM_Init(u16 arr,u16 psc) /此部分需手动修改IO口设置RCC->APB1ENR|=1<<1; /TIM3时钟使能 RCC->APB2ENR|=1<<3; /使能PORTB时钟GPIOB->CRL&=0XFF0FFFFF;/PB5输出GPIOB->CRL|=0X00B00000;/复用功能输出 RCC->APB2ENR|=1<<0; /开启辅助时钟 AFIO->

16、MAPR&=0XFFFFF3FF; /清除MAPR的11:10AFIO->MAPR|=1<<11; /部分重映像,TIM3_CH2->PB5TIM3->ARR=arr;/设定计数器自动重装值 TIM3->PSC=psc;/预分频器不分频TIM3->CCMR1|=7<<12; /CH2 PWM2模式 TIM3->CCMR1|=1<<11; /CH2预装载使能 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);/系统时钟设置 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/注意以上参数任何一个都不能设为0,否则会乱./波特率=Fpclk1/(tbs1+tbs2+1)*brp);/mode:0,普通模式;1,回环模式;/Fpclk1的时钟在初始化的时候设置为36M,如果设置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.再用于设置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;/退出睡眠模式(同时设置所有位

20、为0)CAN->MCR|=1<<0;/请求CAN进入初始化模式while(CAN->MSR&1<<0)=0)i+;if(i>100)return 2;/进入初始化模式失败CAN->MCR|=0<<7;/非时间触发通信模式CAN->MCR|=0<<6;/软件自动离线管理CAN->MCR|=0<<5;/睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)CAN->MCR|=1<<4;/禁止报文自动传送CAN->MCR|=0<<3;/报文不锁定,新的

21、覆盖旧的CAN->MCR|=0<<2;/优先级由报文标识符决定CAN->BTR=0x;/清除原来的设置.CAN->BTR|=mode<<30;/模式设置 0,普通模式;1,回环模式;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; /分频系数(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、工作在标识符屏蔽位模式CAN->FFA1R|=0<<0;/过滤器0关联到FIFO0CAN->sFilterRegister0.FR1=0X;/32位IDCAN->sFilterRegister0.FR2=0X;/32位MASKCAN->FA1R|=1<<0;/激活过滤器0CAN->FMR&=0<<0;/过滤器组进入正常模式#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:标准ID(11位)/扩展ID(11位+18位) /ide:0,标准帧;1,扩展帧/rtr:0,数据帧;1,远程帧/len:要发送的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节)/*dat:数据指针./返回值: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;/无空邮箱,无法发送 CAN->sTxMailBoxmbox.TIR=0;/清除之前的设置if(ide=0)/标准帧id&=0x7ff;/取低11位stdidid<<=21; else/扩展帧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; /设置DLC./待发送数据存入邮箱.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; /请求发送邮箱数据return mbox;/接收数据/fifox:邮箱号/id:标准ID(11位)/扩展ID(11位+18位) /ide:0,标准帧;1,扩展帧/rtr:0,数据帧;1,远程帧/len:接收到的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节)/dat:数据缓存区void Can_Rx_Msg(u8 fifox,u32 *id,u8 *i

28、de,u8 *rtr,u8 *len,u8 *dat) *ide=CAN->sFIFOMailBoxfifox.RIR&0x04;/得到标识符选择位的值 if(*ide=0)/标准标识符*id=CAN->sFIFOMailBoxfifox.RIR>>21;else /扩展标识符*id=CAN->sFIFOMailBoxfifox.RIR>>3;*rtr=CAN->sFIFOMailBoxfifox.RIR&0x02;/得到远程发送请求值.*len=CAN->sFIFOMailBoxfifox.RDTR&0x0F;/得

29、到DLC /*fmi=(CAN->sFIFOMailBoxFIFONumber.RDTR>>8)&0xFF;/得到FMI/接收数据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、始化函数void KEY_Init(void)RCC->APB2ENR|=1<<2; /使能PORTA时钟RCC->APB2ENR|=1<<6; /使能PORTE时钟GPIOA->CRL&=0XFFFFFFF0;/PA0设置成输入,默认下拉 GPIOA->CRL|=0X; GPIOE->CRL&=0XFFF000FF;/PE24设置成输入 GPIOE->CRL|=0X; GPIOE->ODR|=7<<2; /PE24 上拉 /按键处理函数/返回按键值/mode:0,不支持连续按;1,支持连续按;/0,

32、没有任何按键按下/1,KEY0按下/2,KEY1按下/3,KEY2按下 /4,KEY3按下 WK_UP/注意此函数有响应优先级,KEY0>KEY1>KEY2>KEY3!u8 KEY_Scan(u8 mode) static u8 key_up=1;/按键按松开标志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战舰STM32开发板实验25/CAN 实验 /技术支持:/广州市星翼电

34、子科技有限公司 int main(void)u8 key;u8 i=0,t=0;u8 cnt=0;u8 canbuf8;u8 res;u8 mode=1;/CAN工作模式;0,普通模式;1,环回模式 Stm32_Clock_Init(9);/系统时钟设置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;/设置字

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;/设置字体为蓝色 LCD_ShowString(60,170,200,16,16,"Count:&q

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论