中衡ARM程序题目与复习_第1页
中衡ARM程序题目与复习_第2页
中衡ARM程序题目与复习_第3页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、红色的是我加上的程序或改过的程序,黑色的是光盘原版程序 试配置 STM32 系统 的主控时钟配置成 24M 的例子。系统时钟初始化函数 pll:选择的倍频数,从2开始,最大值为16void Stm32_Clock_lnit(u8 PLL)un sig ned char temp=0;MYRCC_De In it(); 复位并配置向量表RCC->CR|=0x00010000; / 外部高速时钟使能 HSEON while(!(RCC->CR>>17); 等待外部时钟就绪RCC->CFGR=0X00000400; APB1=DIV2;APB2=DIV1;AHB=DIV

2、1;PLL-=2; 抵消 2 个单位RCC->CFGR|=PLL<<18; 设置 PLL 值 216RCC->CFGR|=1<<16; /PLLSRC ONFLASH->ACR|=0x32; /FLASH 2 个延时周期RCC->CR|=0x01000000; /PLLON while(!(RCC->CR>>25); 等待 PLL 锁定RCC->CFGR|=0x00000002;/PLL 作为系统时钟 while(temp!=0x02) /等待 PLL 作为系统时钟设置成功 temp=RCC->CFGR>>

3、;2; temp&=0x03;int main(v oid)Stm32_Clock_lnit(3);/ / 系统时钟设置 一 一编写程序外部通道输入一个电压,并用 ADC 的 DMA 模式采样 100 个数据,然 后用 UART 将 ADC 采样的 100 个电压数据传输到电脑上。void Adc_I nit(void)/先初始化 10 口RCC->APB2ENR|=1<<2; /使能 PORTA 口时钟GPIOA->CRL&=0XFFFFFF0F;/PA1 ano log输入/通道 10/11 设置RCC->APB2ENR|=1<<9

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

5、R1 &=(1<<8);/ 非扫描模式ADC1->CR2 &=(1<<1);/ 单次转换模式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);AD

6、C1->SQR1|=0<<20;1 个转换在规则序列中也就是只转换规则序列 1设置通道 1 的采样时间ADC1->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); /等待校准结束该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除

7、。ADC1->CR2|=1<<2;/开启 AD 校准while(ADC1->CR2&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

8、temp_val/times; pclk2:PCLK2 时钟频率 (Mhz) bou nd: 波特率 void uart_i nit(u32 pclk2,u32 bou nd) float temp; u16 man tissa;u16 fractio n; temp=(float)(pclk2*1000000)/(bound*16); 得到 USARTDIV man tissa=temp;/ 得到整数部分fraction=(temp-mantissa)*16; / 得到小数部分man tissa<<=4;man tissa+=fract ion;RCC->APB2ENR|=

9、1<<2;/ 使能 PORTA 口时钟RCC->APB2ENR|=1<<14;/ 使能串口时钟GPIOA->CR H&=OXFFFFFOOF;/IO 状态设置GPIOA->CRH|=0X000008B0;/IO 状态设置RCC->APB2RSTR|=1<<14; 复位串口 1RCC->APB2RSTR&=(1<<14); 停止复位 /波特率设置USART1->BRR=ma ntissa; / 波特率设置USART1->CR1|=0X200C;#if EN_USART1_RX/使能接收中断U

10、SART1->CR1|=1<<8;USART1->CR1|=1<<5;/1 位停止 , 无校验位 ? / 女口果使能了接收/PE 中断使能/接收缓冲区非空中断使能组 2, 最低优先级MY_NVIC_Init(3,3,USART1_IRQChannel,2);/ #en dif #in clude "sys.h" #i nclude "usart.h" #in clude "delay.h"#i nclude "adc.h" int main( void) u16 adcx,i;

11、Stm32_Clock_I nit(9);uart_i ni t(72,9600); delay_i nit(72);Adc_I nit();while(1)for(i=0;i<100;i+) 系统时钟设置串口初始化为 9600 延时初始化/ADC 初始化采集 100 个数据,循环 100 次adcx=Get_Adc_Average(ADC_CH1,10); 转换一次USART1->DR=adcx;/ 把数据送到发送缓存区 while(USART1->SR&(1<<6)=0); 等待发送完成USART1->SR&=(1<<6);

12、/ 清除标志位GPIO 口实现 LED1 灯以 0.1s 闪烁 2s。 /初始化 PB5 和 PE5 为输出口 ?并使能这两个口的时钟 /LED IO 初始化void LED_I nit(void)/使能 PORTB 时钟/使能 PORTE 时钟RCC->APB2ENR|=1<<3;RCC->APB2ENR|=1<<6;GPIOB->CRL&=0XFF0FFFFF;GPI0B->CRL|=0X00300000;/PB.5 推挽输出GPIOB->ODR|=1<<5; /PB.5 输出高GPIOE->CRL&=

13、0XFF0FFFFF;GPIOE->CRL|=0X00300000;/PE.5 推挽输出GPIOE->ODR|=1<<5; /PE.5 输出高通用定时器 3 中断初始化这里时钟选择为 APB1 的 2 倍,而 APB1 为 36M /arr : 自动重装值。 psc :时钟预分频数/这里使用的是定时器 3!void TIM3_Int_Init(u16 arr,u16 psc)RCC->APB1ENR|=1<<1; /TIM3 时钟使能TIM3->ARR=arr;TIM3->PSC=psc;TIM3->DIER|=1<<0;

14、II 刚好 1ms 10Khz 的计数时钟设定计数器自动重装值 预分频器 7200 ,得到 / 允许更新中断TIM3->CR1|=0x01;/使能定时器 31, 子优先级 3, 组 2500 次为 0.05sMY_NVIC_Init(1,3,TIM3_IRQChannel,2); 抢占#in elude "sys.h"#i nclude "timer.h"#i nclude "led.h"int main( void)Stm32_Clock_l ni t(9); 系统时钟设置LED_I nit();TIM3_Int_lnit(4

15、99,7199);/10Khz 的计数频率,计数while(1)u16 c=40; 定义 40 次,正好是 2s void TIM3_IRQHa ndler(void)if(TIM3->SR&0X0001)/ 溢出中断 if(c)LED 仁 ! LED1;c-;TIM3->SR&=(1<<0); 清除中断标志位PWM/TIM3 PWM 部分初始化/PWM 输出初始化/arr : 自动重装值 psc :时钟预分频数void TIM3_PWM_lnit(u16 arr,u16 psc)此部分需手动修改 IO 口设置AFIO->MAPR&=0XF

16、FFFF3FF; /RCC->APB1ENR|=1<<1;RCC->APB2ENR|=1<<3;GPIOB->CRL&=0XFF0FFFFF;GPQB->CRL|=0X00B00000;RCC->APB2ENR|=1<<0;/TIM3 时钟使能使能 PORTB 时钟/PB5 输出 /复用功能输出/ 开启辅助时钟清除 MAPR 的 11:10AFIO->MAPR|=1<<11;/部分重映像 , TIM3_CH2->PB57TIM3->ARR=arr;TIM3->PSC=psc;TIM3-

17、>CCMR1|=7<<12; TIM3->CCMR1|=1<<11; TIM3->CCER|=1<<4; TIM3->CR1=0x0080;TIM3->CR1|=0x01;/设定计数器自动重装值 /预分频器不分频 /CH2 PWM2 模式 /CH2 预装载使能 /OC2 输出使能 /ARPE 使能 /使能定时器 3#in clude "sys.h"#in clude "timer.h" int main( void)Stm32_Clock_l ni t(9); 系统时钟设置TIM3_PWM

18、 nit(899,0);/不分频。 PWM 频率 =72000/(899+1)=80KhzTIM3->CCR2=200; while(1) 占空比赋值CAN/CAN 初始化/tsjw: 重新同步跳跃时间单元 .范围 :13; tbs2:时间段2的时间单元.范围:18;/tbs1: 时间段 1的时间单元 .范围:116;/brp : 波特率分频器 .范围:11024;( 实际要加 1,也就是 11024) tq=(brp)*tpclk1 注意以上参数任何一个都不能设为0, 否则会乱 .波特率 =Fpclk1/(tbs1+tbs2+1)*brp); mode:0, 普通模式 ;1, 回环模式

19、 ;/Fpclkl的时钟在初始化的时候设置为36M,如果设置CAN_Normalnit(1,8,7,5,1);/则波特率为 :36M/(8+7+1)*5)=450Kbps/返回值 :0,初始化 OK;/ 其他初始化失败 ;u8 CAN_Mode_I ni t(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)u16 i=0; if(tsjw=0|tbs2=0|tbs1=0|brp=0)return 1;tsjw-=1;/ 先减去 1.再用于设置tbs2-=1;tbs1-=1;brp-=1;RCC->APB2ENR|=1<<2;/使能 PORTA

20、时钟GPIOA->CR H&=0XFFF00FFF; GPIOA->CRH|=0X000B8000;/PA11 RX,PA12 TX 推挽输出 GPIOA->ODR|=3<<11;RCC->APB1ENR|=1<<25; 使能 CAN 时钟 CAN 使用的是 APB1 的时钟 (max:36M)CAN->MCR=0x0000;退出睡眠模式 ( 同时设置所有位为 0)CAN->MCR|=1<<0;/请求 CAN 进入初始化模式while(CAN->MSR&1<<0)=0)if( i>1

21、00 )return 2;/ 进入初始化模式失败CAN->MCR|=0<<7; /非时间触发通信模式CAN->MCR|=0<<6; 软件自动离线管理的 SLEEP 位 )CAN->MCR|=0<<5; /睡眠模式通过软件唤醒 (清除 CAN->MCRCAN->MCR|=1<<4; /禁止报文自动传送CAN->MCR|=0<<3;CAN->MCR|=0<<2; /报文不锁定 , 新的覆盖旧的CAN->BTR=OxOOOOOOOO; 清除原来的设置CAN->BTR|=mod

22、e<<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) 为 brp+1波特率 :Fpclk1/(Tbs1+Tbs2+1)*Fdiv)CAN->MCR&=(1<<0);/请求

23、 CAN 退出初始化模式while(CAN->MSR&1<<0)=1)i+;if(i>0XFFF0)return 3;/退出初始化模式失败/过滤器初始化CAN->FMR|=1<<0; CAN->FA1R&=(1<<0);CAN->FS1R|=1<<0;CAN->FM1R|=0<<0; CAN->FFA1R|=0<<0;/过滤器组工作在初始化模式/过滤器 0 不激活/ 过滤器位宽为 32 位 ./过滤器 0 工作在标识符屏蔽位模式/ 过滤器 0 关联到 FIFO0CA

24、N->sFilterRegister0.FR1=0X00000000;/32位 IDCAN->sFilterRegister0.FR2=0X00000000;/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_IRQChannel,2);/ 组 2#e

25、n difreturn 0;/id: 标准 ID(11 位"扩展 ID(11 位+18 位) /ide:0, 标准帧 ;1,扩展帧/rtr:0, 数据帧 ;1, 远程帧 len:要发送的数据长度 (固定为8个字节,在时间触发模式下,有效数据为6个字节) *dat: 数据指针 返回值 : 03,邮箱编号 .OXFF, 无有效邮箱 .u8 Can_Tx_Msg(u32 id,u8 ide,u8 rtr,u8 len,u8 *dat) u8 mbox;/邮箱 0 为空else /邮箱 1 为空if(CAN->TSR&(1<<26)mbox=0;else retur

26、n /邮箱 2 为空if(ide=0)/无空邮箱 ,无法发送/清除之前的设置else if(CAN->TSR&(1<<27)mbox=1;if(CAN->TSR&(1<<28)mbox=2;0XFF;CAN->sTxMailBoxmbox.TIR=0;/标准帧 id&=0x7ff;/ 取低 11 位 stdid id<<=21;else/扩展帧 id&=0X1FFFFFFF;/ 取低 32 位 extid id<<=3; CAN->sTxMailBoxmbox.TIR|=id;CAN->

27、;sTxMailBoxmbox.TIR|=ide<<2; CAN->sTxMailBoxmbox.TIR|=rtr<<1; len&=0X0F;/ 得到低四位CAN->sTxMailBoxmbox.TDTR&=(0X0000000F);CAN->sTxMailBoxmbox.TDTR|=len;/ 设置 DLC.待发送数据存入邮箱 .CAN->sTxMailBoxmbox.TDHR=(u32)dat7<<24)|(u32)dat 6 <<16)| (u32)dat 5 <<8)| (u32)da

28、t4); CAN->sTxMailBoxmbox.TDLR=(u32)dat3<<24)|(u32)dat2<<16)| (u32)dat1<<8)| (u32)dat0); CAN->sTxMailBoxmbox.TIR|=1<<0; / 请求发送邮箱数据 return mbo x;/接收数据/fifox: 邮箱号/id: 标准 ID(11 位”扩展 ID(11 位 +18 位)/ide:0, 标准帧 ;1,扩展帧rtr:O,数据帧;1,远程帧len:接收到的数据长度(固定为8个字节,在时间触发模式下,有效数据为6个字节) dat:

29、 数据缓存区void Can_Rx_Msg(u8 fifox,u32 *id,u8 *ide,u8 *rtr,u8 *le n,u8 *dat)得到标识符选择位的值*ide=CAN->sFIFOMailBoxfifox.RIR&0x04;if(*ide=O) 标准标识符 *id=CAN->sFIFOMailBoxfifox.RIR>>21;else 扩展标识符 *id=CAN->sFIFOMailBoxfifox.RIR>>3;*rtr=CAN->sFIFOMailBoxfifox.RIR&0x02; 得到远程发送请求值*len=

30、CAN->sFIFOMailBoxfifox.RDTR&0x0F; 得到 DLC * fmi=(CAN->sFIFOMailBoxFIFONumber.RDTR>>8)&0xFF; 得到 FMI/接收数据 dat0=CAN->sFIFOMailBoxfifox.RDLR&0XFF; dat1=(CAN->sFIFOMailBoxfifox.RDLR>>8)&0 XFF; dat2=(CAN->sFIFOMailBoxfifox.RDLR>>16 )&0XFF; dat3=(CAN->

31、sFIFOMailBoxfifox.RDLR>>24) &0XFF; dat4=CAN->sFIFOMailBoxfifox.RDHR&0 XFF; dat 5=(CAN->sFIFOMailBoxfifox.RDHR>>8 )&0 XFF; dat 6=(CAN->sFIFOMailBoxfifox.RDHR>>16)&0 XFF; 释放dat7=(CAN->sFIFOMailBoxfifox.RDHR>>24)&0 XFF; if(fifox=0)CAN->RF0R|=0X

32、20;FIFOO 邮箱 else if(fifox=1)CAN->RF1R|=0X20; 释放 FIFO1 邮箱/按键初始化函数void KEY nit(void)RCC->APB2ENR|=1<<2;RCC->APB2ENR|=1<<6;GPIOA->CRL&=0XFFFFFFF0;GPQA->CRL|=0X00000008;GPIOE->CRL&=0XFFF000FF;GPIOE->CRL|=0X00088800;GPIOE->ODR|=7<<2;/使能 PORTA 时钟/使能 PORTE

33、时钟 PA0 设置成输入,默认下拉 PE24 设置成输入 PE24 上拉按键处理函数/返回按键值 mode:0, 不支持连续按 ;1,支持连续按 ;0, 没有任何按键按下 1, KEY0 按下 2, KEY1 按下 3, KEY2 按下114, KEY3 按下 WK_UP注意此函数有响应优先级, KEY0>KEY1>KEY2>KEY3!u8 KEY_Sca n(u8 mode)static u8 key_up=1; 按键按松开标志 if(mode)key_up=1; / 支持连按 if(key_up&&(KEY0=0|KEY1=0|KEY2=0|KEY3=1)

34、delay_ms(10); 去抖动key_up=0;if(KEYO=O)return 1;else if(KEY1=0)return 2;else if(KEY2=0)return 3;无按键按下else if(KEY3=1)return 4;else if(KEY0=1 &&KEY1=1 &&KEY2=1 &&KEY3=0)key_up=1; return 0;/ #in clude "sys.h"#in clude "delay.h"#i nclude "key.h"#i nclud

35、e "lcd.h" #in clude "ca n.h" /ALIENTEK 战舰 STM32 开发板实验 25 /CAN 实验/技术支持: /广州市星翼电子科技有限公司 int main( void)u8 key;u8 i=0,t=0; u8 cnt=0;u8 can buf8;u8 res;u8 mode=1;/CAN 工作模式 ;0, 普通模式 ;1, 环回模式Stm32_Clock_l ni t(9); uart_i ni t(72,9600); delay_init(72);口系统时钟设置串口初始化为 9600延时初始化/ 初始化与LED 连接

36、的硬件接LCD nit();/初始化 LCDKEY_Ini t();/按键初始化CAN_Mode_Init(1,8,7,5,mode);/CAN初始化 ,波特率 450KbpsPOINT_COLOR=RED; 设置字体为红色LCD_ShowStri ng(60,50,200,16,16,"WarShip STM32");LCD_ShowStri ng(60,70,200,16,16,"CAN TEST");LCD_ShowStri ng(60,90,200,16,16,"ATOMALIENTEK");LCD_ShowStri ng(60,110,200,16,16,"2012/9/11");LCD_ShowStri ng(60,130,200,16,16,"LoopBack Mode");LCD_ShowStri ng(60,150,200,16,16,"KEY0:Se nd WK_UP:Mode"); 显示提示信息POINT_COLOR=BLUE; 设置字体为蓝色LCD_ShowStri ng(60,170

温馨提示

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

评论

0/150

提交评论