- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ARM程序设计题目与复习
红色的是我加上的程序或改过的程序,黑色的是光盘原版程序
试配置STM32系统的主控时钟配置成24M的例子。
//系统时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;
MYRCC_DeInit(); //复位并配置向量表
RCC-CR|=0 //外部高速时钟使能HSEON
while(!(RCC-CR17));//等待外部时钟就绪
RCC-CFGR=0 //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC-CFGR|=PLL18; //设置PLL值 2~16
RCC-CFGR|=116; //PLLSRC ON
FLASH-ACR|=0x32; //FLASH 2个延时周期
RCC-CR|=0 //PLLON
while(!(RCC-CR25));//等待PLL锁定
RCC-CFGR|=0//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|=12; //使能PORTA口时钟
GPIOA-CRL=0XFFFFFF0F;//PA1 anolog输入
//通道10/11设置
RCC-APB2ENR|=19; //ADC1时钟使能
RCC-APB2RSTR|=19; //ADC1复位
RCC-APB2RSTR=~(19);//复位结束
RCC-CFGR=~(314); //分频因子清零
//SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!
//否则将导致ADC准确度下降!
RCC-CFGR|=214;
ADC1-CR1=0XF0FFFF; //工作模式清零
ADC1-CR1|=016; //独立工作模式
ADC1-CR1=~(18); //非扫描模式
ADC1-CR2=~(11); //单次转换模式
ADC1-CR2=~(717);
ADC1-CR2|=717; //软件控制转换
ADC1-CR2|=120; //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发
ADC1-CR2|=18; //使用DMA
ADC1-CR2=~(111); //右对齐
ADC1-SQR1=~(0XF20);
ADC1-SQR1|=020; //1个转换在规则序列中 也就是只转换规则序列1
//设置通道1的采样时间
ADC1-SMPR2=~(73); //通道1采样时间清空
ADC1-SMPR2|=73; //通道1 239.5周期,提高采样时间可以提高精确度
ADC1-CR2|=10; //开启AD转换器
ADC1-CR2|=13; //使能复位校准
while(ADC1-CR213); //等待校准结束
//该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。
ADC1-CR2|=12; //开启AD校准
while(ADC1-CR212); //等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
}
//获取通道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;
}
文档评论(0)