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

下载本文档

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

文档简介

红色的是我加上的程序或改过的程序,黑色的是光盘原版程序试配置STM32系统的主控时钟配置成24M的例子。/系统时钟初始化函数/pll:选择的倍频数,从2开始,最大值为16void Stm32_Clock_Init(u8 PLL)unsigned char temp=0; MYRCC_DeInit(); /复位并配置向量表 RCC-CR|=0x00010000; /外部高速时钟使能HSEONwhile(!(RCC-CR17);/等待外部时钟就绪RCC-CFGR=0X00000400; /APB1=DIV2;APB2=DIV1;AHB=DIV1;PLL-=2;/抵消2个单位RCC-CFGR|=PLLCFGR|=1ACR|=0x32; /FLASH 2个延时周期RCC-CR|=0x01000000; /PLLONwhile(!(RCC-CR25);/等待PLL锁定RCC-CFGR|=0x00000002;/PLL作为系统时钟 while(temp!=0x02) /等待PLL作为系统时钟设置成功 temp=RCC-CFGR2;temp&=0x03; int main(void) Stm32_Clock_Init(3);/系统时钟设置编写程序外部通道输入一个电压,并用ADC的DMA模式采样100个数据,然后用UART将ADC采样的100个电压数据传输到电脑上。void Adc_Init(void) /先初始化IO口 RCC-APB2ENR|=1CRL&=0XFFFFFF0F;/PA1 anolog输入/通道10/11设置 RCC-APB2ENR|=1APB2RSTR|=1APB2RSTR&=(1CFGR&=(3CFGR|=2CR1&=0XF0FFFF; /工作模式清零ADC1-CR1|=0CR1&=(1CR2&=(1CR2&=(7CR2|=7CR2|=1CR2|=1CR2&=(1SQR1&=(0XFSQR1|=0SMPR2&=(7SMPR2|=7CR2|=1CR2|=1CR2&1CR2|=1CR2&12); /等待校准结束/该位由软件设置以开始校准,并在校准结束时由硬件清除 /获取通道ch的转换值,取times次,然后平均 /ch:通道编号/times:获取次数/返回值:通道ch的times次转换结果平均值u16 Get_Adc_Average(u8 ch,u8 times)u32 temp_val=0;u8 t;for(t=0;ttimes;t+)temp_val+=Get_Adc(ch);delay_ms(5);return temp_val/times;/pclk2:PCLK2时钟频率(Mhz)/bound:波特率void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);/得到USARTDIVmantissa=temp; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分 mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F;/IO状态设置GPIOA-CRH|=0X000008B0;/IO状态设置 RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; / 波特率设置 USART1-CR1|=0X200C; /1位停止,无校验位.#if EN_USART1_RX /如果使能了接收/使能接收中断USART1-CR1|=1CR1|=15; /接收缓冲区非空中断使能 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) for(i=0;iDR=adcx;/把数据送到发送缓存区while(USART1-SR&(1SR&=(1APB2ENR|=1APB2ENR|=1CRL&=0XFF0FFFFF; GPIOB-CRL|=0X00300000;/PB.5 推挽输出 GPIOB-ODR|=1CRL&=0XFF0FFFFF;GPIOE-CRL|=0X00300000;/PE.5推挽输出GPIOE-ODR|=1APB1ENR|=1ARR=arr; /设定计数器自动重装值/刚好1ms TIM3-PSC=psc; /预分频器7200,得到10Khz的计数时钟 TIM3-DIER|=1CR1|=0x01; /使能定时器3 MY_NVIC_Init(1,3,TIM3_IRQChannel,2);/抢占1,子优先级3,组2 #include sys.h#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&=(1APB1ENR|=1APB2ENR|=1CRL&=0XFF0FFFFF;/PB5输出GPIOB-CRL|=0X00B00000;/复用功能输出 RCC-APB2ENR|=1MAPR&=0XFFFFF3FF; /清除MAPR的11:10AFIO-MAPR|=1PB5TIM3-ARR=arr;/设定计数器自动重装值 TIM3-PSC=psc;/预分频器不分频TIM3-CCMR1|=7CCMR1|=1CCER|=1CR1=0x0080; /ARPE使能 TIM3-CR1|=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;(实际要加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=0|brp=0)return 1;tsjw-=1;/先减去1.再用于设置tbs2-=1;tbs1-=1;brp-=1;RCC-APB2ENR|=1CRH&=0XFFF00FFF; GPIOA-CRH|=0X000B8000;/PA11 RX,PA12 TX推挽输出 GPIOA-ODR|=3APB1ENR|=1MCR=0x0000;/退出睡眠模式(同时设置所有位为0)CAN-MCR|=1MSR&1100)return 2;/进入初始化模式失败CAN-MCR|=0MCR|=0MCR|=0MCR的SLEEP位)CAN-MCR|=1MCR|=0MCR|=0BTR=0x00000000;/清除原来的设置.CAN-BTR|=modeBTR|=tsjwBTR|=tbs2BTR|=tbs1BTR|=brpMCR&=(1MSR&10XFFF0)return 3;/退出初始化模式失败/过滤器初始化CAN-FMR|=1FA1R&=(1FS1R|=1FM1R|=0FFA1R|=0sFilterRegister0.FR1=0X00000000;/32位IDCAN-sFilterRegister0.FR2=0X00000000;/32位MASKCAN-FA1R|=1FMR&=0IER|=1TSR&(1TSR&(1TSR&(1sTxMailBoxmbox.TIR=0;/清除之前的设置if(ide=0)/标准帧id&=0x7ff;/取低11位stdidid=21; else/扩展帧id&=0X1FFFFFFF;/取低32位extididsTxMailBoxmbox.TIR|=id; CAN-sTxMailBoxmbox.TIR|=idesTxMailBoxmbox.TIR|=rtrsTxMailBoxmbox.TDTR&=(0X0000000F);CAN-sTxMailBoxmbox.TDTR|=len; /设置DLC./待发送数据存入邮箱.CAN-sTxMailBoxmbox.TDHR=(u32)dat724)|(u32)dat616)| (u32)dat5sTxMailBoxmbox.TDLR=(u32)dat324)|(u32)dat216)| (u32)dat1sTxMailBoxmbox.TIR|=1sFIFOMailBoxfifox.RIR&0x04;/得到标识符选择位的值 if(*ide=0)/标准标识符*id=CAN-sFIFOMailBoxfifox.RIR21;else /扩展标识符*id=CAN-sFIFOMailBoxfifox.RIR3;*rtr=CAN-sFIFOMailBoxfifox.RIR&0x02;/得到远程发送请求值.*len=CAN-sFIFOMailBoxfifox.RDTR&0x0F;/得到DLC /*fmi=(CAN-sFIFOMailBoxFIFONumber.RDTR8)&0xFF;/得到FMI/接收数据dat0=CAN-sFIFOMailBoxfifox.RDLR&0XFF;dat1=(CAN-sFIFOMailBoxfifox.RDLR8)&0XFF;dat2=(CAN-sFIFOMailBoxfifox.RDLR16)&0XFF;dat3=(CAN-sFIFOMailBoxfifox.RDLR24)&0XFF; dat4=CAN-sFIFOMailBoxfifox.RDHR&0XFF;dat5=(CAN-sFIFOMailBoxfifox.RDHR8)&0XFF;dat6=(CAN-sFIFOMailBoxfifox.RDHR16)&0XFF;dat7=(CAN-sFIFOMailBoxfifox.RDHR24)&0XFF; if(fifox=0)CAN-RF0R|=0X20;/释放FIFO0邮箱else if(fifox=1)CAN-RF1R|=0X20;/释放FIFO1邮箱 /按键初始化函数void KEY_Init(void)RCC-APB2ENR|=1APB2ENR|=1CRL&=0XFFFFFFF0;/PA0设置成输入,默认下拉 GPIOA-CRL|=0X00000008; GPIOE-CRL&=0XFFF000FF;/PE24设置成输入 GPIOE-CRL|=0X00088800; GPIOE-ODR|=7KEY1KEY2KEY3!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)return 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 实验 /技术支持:/广州市星翼电子科技有限公司 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;/设置字体为红色 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:);/显示当前计数值LCD_ShowString(60,190,200,16,16,Send Data:);/提示发送的数据LCD_ShowString(60,250,200,16,16,Receive Data:);/提示接收到的数据 while(1)key=KEY_Scan(0);if(key=KEY_RIGHT)/KEY0按下,发送一次数据for(i=0;i8;i+)canbufi=cnt+i;/填充发送缓冲区if(i4)LCD_ShowxNum(60+i*32,210,canbufi,3,16,0X80);/显示数据else LCD_ShowxNum(60+(i-4)*32,230,canbufi,3,16,0X80);/显示数据 res=Can_Send_Msg(canbuf,8);/发送8个字节 if(r

温馨提示

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

评论

0/150

提交评论