资源描述:
《ARM程序设计题目与复习》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、红色的是我加上的程序或改过的程序,黑色的是光盘原版程序试配置STM32系统的主控时钟配置成24M的例子。//系统时钟初始化函数//pll:选择的倍频数,从2开始,最大值为16voidStm32_Clock_Init(u8PLL){unsignedchartemp=0;MYRCC_DeInit();//复位并配置向量表RCC->CR
2、=0x00010000;//外部高速时钟使能HSEONwhile(!(RCC->CR>>17));//等待外部时钟就绪RCC->CFGR=0X00000400;//APB1=DIV2;APB2=DIV1;AHB=DI
3、V1;PLL-=2;//抵消2个单位RCC->CFGR
4、=PLL<<18;//设置PLL值2~16RCC->CFGR
5、=1<<16;//PLLSRCONFLASH->ACR
6、=0x32;//FLASH2个延时周期RCC->CR
7、=0x01000000;//PLLONwhile(!(RCC->CR>>25));//等待PLL锁定RCC->CFGR
8、=0x00000002;//PLL作为系统时钟while(temp!=0x02)//等待PLL作为系统时钟设置成功{temp=RCC->CFGR>>2;temp&=0x03;}}intmain(void
9、){Stm32_Clock_Init(3);//系统时钟设置}编写程序外部通道输入一个电压,并用ADC的DMA模式采样100个数据,然后用UART将ADC采样的100个电压数据传输到电脑上。voidAdc_Init(void){//先初始化IO口RCC->APB2ENR
10、=1<<2;//使能PORTA口时钟GPIOA->CRL&=0XFFFFFF0F;//PA1anolog输入//通道10/11设置RCC->APB2ENR
11、=1<<9;//ADC1时钟使能RCC->APB2RSTR
12、=1<<9;//ADC1复位RCC->APB2RSTR&=~(
13、1<<9);//复位结束RCC->CFGR&=~(3<<14);//分频因子清零//SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M!//否则将导致ADC准确度下降!RCC->CFGR
14、=2<<14;ADC1->CR1&=0XF0FFFF;//工作模式清零ADC1->CR1
15、=0<<16;//独立工作模式ADC1->CR1&=~(1<<8);//非扫描模式ADC1->CR2&=~(1<<1);//单次转换模式ADC1->CR2&=~(7<<17);ADC1->CR2
16、=7<<17;//软件控制转换ADC1->C
17、R2
18、=1<<20;//使用用外部触发(SWSTART)!!!必须使用一个事件来触发ADC1->CR2
19、=1<<8;//使用DMAADC1->CR2&=~(1<<11);//右对齐ADC1->SQR1&=~(0XF<<20);ADC1->SQR1
20、=0<<20;//1个转换在规则序列中也就是只转换规则序列1//设置通道1的采样时间ADC1->SMPR2&=~(7<<3);//通道1采样时间清空ADC1->SMPR2
21、=7<<3;//通道1239.5周期,提高采样时间可以提高精确度ADC1->CR2
22、=1<<0;//开启AD转换器ADC1->CR
23、2
24、=1<<3;//使能复位校准while(ADC1->CR2&1<<3);//等待校准结束//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。ADC1->CR2
25、=1<<2;//开启AD校准while(ADC1->CR2&1<<2);//等待校准结束//该位由软件设置以开始校准,并在校准结束时由硬件清除}//获取通道ch的转换值,取times次,然后平均//ch:通道编号//times:获取次数//返回值:通道ch的times次转换结果平均值u16Get_Adc_Average(u8ch,u8times){u32temp_va
26、l=0;u8t;for(t=0;t27、antissa)*16;//得到小数部分mantissa<<=4;mantissa+=fraction;RCC->APB2ENR
28、=1<<2;//使能