ARM复习.docx
- 文档编号:25233976
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:26
- 大小:22.69KB
ARM复习.docx
《ARM复习.docx》由会员分享,可在线阅读,更多相关《ARM复习.docx(26页珍藏版)》请在冰豆网上搜索。
ARM复习
第4章GPIO口实验
通过代码控制ALIENTEK战舰STM32开发板上的两个LED:
DS0和DS1
交替闪烁,实现类似跑马灯的效果
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"led.h"
intmain(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72);//延时初始化
LED_Init();//初始化与LED相连的硬件接口
while
(1)
{
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
}
//初始化PB5和PE5,为输出口,并使能这两个口的时钟
//LEDIO初始化
voidLED_Init(void)
{
RCC->APB2ENR|=1<<3;//使能PORTB时钟,寄存器APB2ENR第2为开始依次使能
//GPIOA~F.
RCC->APB2ENR|=1<<6;//使能PORTE时钟
GPIOB->CRL&=0XFF0FFFFF;
GPIOB->CRL|=0X00300000;//PB.5推挽输出
GPIOB->ODR|=1<<5;//PB.5输出高
GPIOE->CRL&=0XFF0FFFFF;
GPIOE->CRL|=0X00300000;//PE.5推挽输出
GPIOE->ODR|=1<<5;//PE.5输出高
}
第6章ADC实验程序
使用STM32的ADC1通道0来采样外部电压值,并在TFTLCD模块上显示出来
#include"sys.h"
#include"usart.h"
#include"delay.h"
#include"led.h"
#include"beep.h"
#include"key.h"
#include"exti.h"
#include"wdg.h"
#include"timer.h"
#include"tpad.h"
#include"oled.h"
#include"lcd.h"
#include"usmart.h"
#include"rtc.h"
#include"wkup.h"
#include"adc.h"
intmain(void)
{
u16adcx;
floattemp;
Stm32_Clock_Init(9);//系统时钟设置
uart_init(72,9600);//串口初始化为9600
delay_init(72);//延时初始化
LED_Init();//初始化与LED连接的硬件接口
LCD_Init();//初始化LCD
usmart_dev.init(72);//初始化USMART
Adc_Init();//ADC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"WarShipSTM32");
LCD_ShowString(60,70,200,16,16,"ADCTEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/7");
//显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16,"ADC_CH0_VAL:
");
LCD_ShowString(60,150,200,16,16,"ADC_CH0_VOL:
0.000V");
while
(1)
{
adcx=Get_Adc_Average(ADC_CH1,10);
LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC值
temp=(float)adcx*(3.3/4096);
adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值
temp-=adcx;
temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80);
LED0=!
LED0;
delay_ms(250);
}
}
voidAdc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2;//使能PORTA时钟
GPIOA->CRL&=0XFFFFFF0F;//PA1anolog输入
//通道10、11设置
RCC->APB2ENR|=1<<9;//ADC1时钟使能
RCC->APB2RSTR|=1<<9;//ADC1复位
RCC->APB2RSTR&=~(1<<9);//复位结束
RCC->CFGR&=~(3<<14);//分频因子清零
//SYSCLK/DIV2=12MADC时钟设置为12M,ADC最大时钟不能超过14M,
//否则将导致ADC准确度下降
RCC->CFGR|=2<<14;
ADC1->CR1&=0XF0FFFF;//工作模式清零
ADC1->CR1|=0<<16;//独立工作模式
ADC1->CR1&=~(1<<8);//非扫描模式
ADC1->CR2&=~(1<<1);//单次转换模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17;//软件控制转换
ADC1->CR2|=1<<20;//使能外部触发(SWSTART)!
!
!
必须使用一个事件来触发ADC1->CR2&=~(1<<11);//右对齐
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20;//1个转换在规则序列中,也就是只转换规则序列1
//设置通道1的采样时间
ADC1->SMPR2&=~(7<<3);//通道1的采样时间清空
ADC1->SMPR2|=7<<3;/通道1239.5周期,提高采样时间可以提高精确度
ADC1->CR2|=1<<0;//开启AD转换器
ADC1->CR2|=1<<3;//使能复位校准
while(ADC1->CR2&1<<3);//等待校准结束
//该位由软件设置并由硬件清除,在校准寄存器初始化后该为将被清除
ADC1->CR2|=1<<2;//开启AD校准
while(ADC1->CR2&1<<2);//等待校准结束
//该位由软件设置以开始校准,并在校准结束时由硬件清除
}
//获得ADC值
//ch:
通道值0~16
//返回值:
转换结果
u16Get_Adc(u8ch)
{
//设置转换序列
ADC1->SQR3&=0XFFFFFFE0;//规则序列1通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22;//启动规则转换通道
while(!
(ADC1->SR&1<<1));//等待转换结束
returnADC1->DR;//返回ADC值
}
//获取通道CH的的转换值,取times次,然后平均
//ch:
通道编号
//times:
获取次数
//返回值:
通道ch的times次转换结果平均值
u16Get_Adc_Average(u8ch,u8times)
{
u32temp_val=0;
u8t;
for(t=0;t { temp_val+=Get_Adc(ch); delay_ms(5); } returntemp_val/times; } 第8章定时器中断实验程序 使用TIM3的定时器中断来控制DS1的翻转,在主函数用DS0的翻转来提示程序正在运行。 #include"sys.h" #include"usart.h" #include"delay.h" #include"led.h" #include"beep.h" #include"key.h" #include"exti.h" #include"wdg.h" #include"timer.h" intmain(void) { Stm32_Clock_Init(9);//系统时钟设置 uart_init(72,9600);//串口初始化为9600 delay_init(72);//延时初始化¯ LED_Init();//LED初始化 BEEP_Init();//蜂鸣器初始化 KEY_Init();//按键初始化 TIM3_Int_Init(4999,7199);//10Khz的计数频率计数5K次为500ms while (1) { LED0=! LED0; delay_ms(200); } } voidTIM3_Int_Init(u16arr,u16psc) { 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 } voidTIM3_IRQHandler(void)//中断服务程序 { if(TIM3->SR&0X0001)//溢出中断 { LED1=! LED1; } TIM3->SR&=~(1<<0);//清除中断标志 } 第13章CAN实验程序 使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。 #include"sys.h" #include"usart.h" #include"delay.h" #include"led.h" #include"beep.h" #include"key.h" #include"exti.h" #include"wdg.h" #include"timer.h" #include"tpad.h" #include"oled.h" #include"lcd.h" #include"usmart.h" #include"rtc.h" #include"wkup.h" #include"adc.h" #include"dac.h" #include"dma.h" #include"24cxx.h" #include"flash.h" #include"rs485.h" #include"can.h" intmain(void) { u8key; u8i=0,t=0; u8cnt=0; u8canbuf[8]; u8res; u8mode=1;//CAN工作模式: 0,普通模式;1,环回模式 Stm32_Clock_Init(9);//系统时钟设置 uart_init(72,9600);//串口初始化为9600 delay_init(72);//延时初始化 LED_Init();//LED初始化 LCD_Init();//初始化LCD usmart_dev.init(72);//初始化USMART KEY_Init();//初始化按键 CAN_Mode_Init(1,8,7,5,mode);//CAN初始化,波特率450Kbps POINT_COLOR=RED;//设置字体颜色为红色 LCD_ShowString(60,50,200,16,16,"WarShipSTM32"); LCD_ShowString(60,70,200,16,16,"CANTEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2012/9/11"); LCD_ShowString(60,130,200,16,16,"LoopBackMode"); LCD_ShowString(60,150,200,16,16,"KEY0: SendWK_UP: Mode");//显示提示信息 POINT_COLOR=BLUE;//设置字体颜色为蓝色 LCD_ShowString(60,170,200,16,16,"Count: ");//显示当前计数 LCD_ShowString(60,190,200,16,16,"SendData: ");/提示发送的数据 LCD_ShowString(60,250,200,16,16,"ReceiveData: ");//提示接收到的数据 while (1) { key=KEY_Scan(0); if(key==KEY_RIGHT)//KEY0按下,发送一次数据 { for(i=0;i<8;i++) { canbuf[i]=cnt+i;//填充发送缓冲区if(i<4)LCD_ShowxNum(60+i*32,210,canbuf[i],3,16,0X80);//显示数据 elseLCD_ShowxNum(60+(i-4)*32,230,canbuf[i],3,16,0X80);//显示数据 } res=Can_Send_Msg(canbuf,8);//发送8个字节 if(res)LCD_ShowString(60+80,190,200,16,16,"Failed");//提示失败 elseLCD_ShowString(60+80,190,200,16,16,"OK");//提示成功¦ }elseif(key==KEY_UP)//WK_UP按下,改变CAN工作模式 { mode=! mode; CAN_Mode_Init(1,8,7,5,mode);//CAN普通模式初始化,波特率450Kbps POINT_COLOR=RED;//设置字体颜色为红色 if(mode==0)//普通模式,需要两个开发板 { LCD_ShowString(60,130,200,16,16,"NnormalMode"); }else//回环模式,一个开发板就可以测试 { LCD_ShowString(60,130,200,16,16,"LoopBackMode"); } POINT_COLOR=BLUE;//设置字体颜色为蓝色 } key=Can_Receive_Msg(canbuf); if(key)//接收到数据 { LCD_Fill(60,270,130,310,WHITE);//清除之前的显示 for(i=0;i { if(i<4)LCD_ShowxNum(60+i*32,270,canbuf[i],3,16,0X80);//显示数据 elseLCD_ShowxNum(60+(i-4)*32,290,canbuf[i],3,16,0X80);//显示数据 } } t++; delay_ms(10); if(t==20) { LED0=! LED0;//提示系统正在运行 t=0; cnt++; LCD_ShowxNum(60+48,170,cnt,3,16,0X80);//显示数据 } } } 第13章CAN应用 #include"sys.h" #include"usart.h" #include"delay.h" #include"led.h" #include"beep.h" #include"key.h" #include"exti.h" #include"wdg.h" #include"timer.h" #include"tpad.h" #include"oled.h" #include"lcd.h" #include"usmart.h" #include"rtc.h" #include"wkup.h" #include"adc.h" #include"dac.h" #include"dma.h" #include"24cxx.h" #include"flash.h" #include"rs485.h" #include"can.h" //ALIENTEK战舰STM32开发板实验25 //CAN实验 //技术支持: //广州市星翼电子科技有限公司 intmain(void) { u8key; u8i=0,t=0; u8cnt=0; u8canbuf[8]; u8res; u8mode=1;//CAN工作模式;0,普通模式;1,环回模式 Stm32_Clock_Init(9);//系统时钟设置 uart_init(72,9600);//串口初始化为9600 delay_init(72);//延时初始化 LED_Init();//初始化与LED连接的硬件接口 LCD_Init();//初始化LCD usmart_dev.init(72);//初始化USMART KEY_Init();//按键初始化 CAN_Mode_Init(1,8,7,5,mode);//CAN初始化,波特率450Kbps POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"WarShipSTM32"); LCD_ShowString(60,70,200,16,16,"CANTEST"); LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK"); LCD_ShowString(60,110,200,16,16,"2012/9/11"); LCD_ShowString(60,130,200,16,16,"LoopBackMode"); LCD_ShowString(60,150,200,16,16,"KEY0: SendWK_UP: Mode");//显示提示信息 POINT_COLOR=BLUE;//设置字体为蓝色 LCD_ShowString(60,170,200,16,16,"Count: ");//显示当前计数值 LCD_ShowString(60,190,200,16,16,"SendData: ");//提示发送的数据 LCD_ShowString(60,250,200,16,16,"ReceiveData: ");//提示接收到的数据 while (1) { key=KEY_Scan(0); if(key==KEY_RIGHT)//KEY0按下,发送一次数据 { for(i=0;i<8;i++) { canbuf[i]=cnt+i;//填充发送缓冲区 if(i<4)LCD_ShowxNum(60+i*32,210,canbuf[i],3,16,0X80);//显示数据 elseLCD_ShowxNum(60+(i-4)*32,230,canbuf[i],3,16,0X80);//显示数据 } res=Can_Send_Msg(canbuf,8);//发送8个字节 if(res)LCD_ShowString(60+80,190,200,16,16,"Failed");//提示发送失败 elseLCD_ShowString(60+80,190,200,16,16,"OK");//提示发送成功 }elseif(key==KEY_UP)//WK_UP按下,改变CAN的工作模式 { mode=! mode; CAN_Mode_Init(1,8,7,5,mode);//CAN普通模式初始化,普通模式,波特率450Kbps POINT_COLOR=RED;//设置字体为红色 if(mode==0)//普通模式,需要2个开发板 { LCD_ShowString(60,130,200,16,16,"NnormalMode"); }else//回环模式,一个开发板就可以测试了. { LCD_ShowString(60,130,200,16,16,"LoopBackMode"); } POINT_COLOR=BLUE;//设置字体为蓝色 } key=Can_Receive_Msg(canbuf); if(key)//接收到有数据 { LCD_Fill(60,270,130,310,WHITE);//清除之前的显示 for(i=0;i { if(i<4)LCD_ShowxNum(60+i*32,270,canbuf[i],3,16,0X80);//显示数据 elseLCD_ShowxNum(60+(i-4)*32,290,canbuf[i],3,16,0X80);//显示数据 } } t++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 复习
![提示](https://static.bdocx.com/images/bang_tan.gif)