ARM期末复习.docx
- 文档编号:3972067
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:15
- 大小:20.83KB
ARM期末复习.docx
《ARM期末复习.docx》由会员分享,可在线阅读,更多相关《ARM期末复习.docx(15页珍藏版)》请在冰豆网上搜索。
ARM期末复习
定时器中断
#include"timer.h"
#include"led.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:
自动重装值。
//psc:
时钟预分频数
//这里使用的是定时器3!
voidTIM3_Int_Init(u16arr,u16psc)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
NVIC_InitTypeDefNVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//时钟使能
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//设置时钟分割:
TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能指定的TIM3中断,允许更新中断
//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;//TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);//初始化NVIC寄存器
TIM_Cmd(TIM3,ENABLE);//使能TIMx
}
//定时器3中断服务程序
voidTIM3_IRQHandler(void)//TIM3中断
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!
=RESET)//检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中断标志
LED1=!
LED1;
}
}
定时器主程序
#include"led.h"
#include"delay.h"
#include"key.h"
#include"sys.h"
#include"usart.h"
#include"timer.h"
intmain(void)
{
delay_init();//延时函数初始化
NVIC_Configuration();//设置NVIC中断分组2:
2位抢占优先级,2位响应优先级
uart_init(9600);//串口初始化为9600
LED_Init();//LED端口初始化
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms
while
(1)
{
LED0=!
LED0;
delay_ms(200);
}
}
GPIO口的配置
#include"led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LEDIO初始化
voidLED_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE);//使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED0-->PB.5端口配置
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5);//PB.5输出高
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//LED1-->PE.5端口配置,推挽输出
GPIO_Init(GPIOE,&GPIO_InitStructure);//推挽输出,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5);//PE.5输出高
}
GPIO口主程序
#include"led.h"
#include"delay.h"
#include"sys.h"
intmain(void)
{
delay_init();//延时函数初始化
LED_Init();//初始化与LED连接的硬件接口
while
(1)
{
LED0=0;
LED1=1;
delay_ms(300);//延时300ms
LED0=1;
LED1=0;
delay_ms(300);//延时300ms
}
}
ADC的配置
#include"adc.h"
#include"delay.h"
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
voidAdc_Init(void)
{
ADC_InitTypeDefADC_InitStructure;
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);//使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC分频因子672M/6=12,ADC最大时间不能超过14M
//PA1作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;//模拟输入引脚
GPIO_Init(GPIOA,&GPIO_InitStructure);
ADC_DeInit(ADC1);//复位ADC1,将外设ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC工作模式:
ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE;//模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1;//顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1,&ADC_InitStructure);//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1,ENABLE);//使能指定的ADC1
ADC_ResetCalibration(ADC1);//使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束
ADC_StartCalibration(ADC1);//开启AD校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
//ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:
通道值0~3
u16Get_Adc(u8ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);//ADC1,ADC通道,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使能指定的ADC1的软件转换启动功能
while(!
ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//等待转换结束
returnADC_GetConversionValue(ADC1);//返回最近一次ADC1规则组的转换结果
}
u16Get_Adc_Average(u8ch,u8times)
{
u32temp_val=0;
u8t;
for(t=0;t { temp_val+=Get_Adc(ch); delay_ms(5); } returntemp_val/times; } ADC的主函数 #include"led.h" #include"delay.h" #include"key.h" #include"sys.h" #include"lcd.h" #include"usart.h" #include"adc.h" intmain(void) { u16adcx; floattemp; delay_init();//延时函数初始化 NVIC_Configuration();//设置NVIC中断分组2: 2位抢占优先级,2位响应优先级 uart_init(9600);//串口初始化为9600 LED_Init();//LED端口初始化 LCD_Init(); 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_Channel_1,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); } } CAN的配置 #include"can.h" #include"led.h" #include"delay.h" #include"usart.h" ////////////////////////////////////////////////////////////////////////////////// //CAN初始化 //tsjw: 重新同步跳跃时间单元.范围: 1~3;CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq //tbs2: 时间段2的时间单元.范围: 1~8; //tbs1: 时间段1的时间单元.范围: 1~16;CAN_BS1_1tq~CAN_BS1_16tq //brp: 波特率分频器.范围: 1~1024;(实际要加1,也就是1~1024)tq=(brp)*tpclk1 //注意以上参数任何一个都不能设为0,否则会乱. //波特率=Fpclk1/((tsjw+tbs1+tbs2)*brp); //mode: 0,普通模式;1,回环模式; //Fpclk1的时钟在初始化的时候设置为36M,如果设置CAN_Normal_Init(1,8,7,5,1); //则波特率为: 36M/((1+8+7)*5)=450Kbps //返回值: 0,初始化OK; //其他,初始化失败; u8CAN_Mode_Init(u8tsjw,u8tbs2,u8tbs1,u16brp,u8mode) { GPIO_InitTypeDefGPIO_InitStructure; CAN_InitTypeDefCAN_InitStructure; CAN_FilterInitTypeDefCAN_FilterInitStructure; #ifCAN_RX0_INT_ENABLE NVIC_InitTypeDefNVIC_InitStructure; #endif RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//使能CAN1时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化IO //CAN单元设置 CAN_InitStructure.CAN_TTCM=DISABLE;//非时间触发通信模式// CAN_InitStructure.CAN_ABOM=DISABLE;//软件自动离线管理// CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)// CAN_InitStructure.CAN_NART=ENABLE;//禁止报文自动传送// CAN_InitStructure.CAN_RFLM=DISABLE;//报文不锁定,新的覆盖旧的// CAN_InitStructure.CAN_TXFP=DISABLE;//优先级由报文标识符决定// CAN_InitStructure.CAN_Mode=mode;//模式设置: mode: 0,普通模式;1,回环模式;// //设置波特率 CAN_InitStructure.CAN_SJW=tsjw;//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位CAN_SJW_1tqCAN_SJW_2tqCAN_SJW_3tqCAN_SJW_4tq CAN_InitStructure.CAN_BS1=tbs1;//Tbs1=tbs1+1个时间单位CAN_BS1_1tq~CAN_BS1_16tq CAN_InitStructure.CAN_BS2=tbs2;//Tbs2=tbs2+1个时间单位CAN_BS2_1tq~CAN_BS2_8tq CAN_InitStructure.CAN_Prescaler=brp;//分频系数(Fdiv)为brp+1// CAN_Init(CAN1,&CAN_InitStructure);//初始化CAN1 CAN_FilterInitStructure.CAN_FilterNumber=0;//过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;//32位 CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;////32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32位MASK CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0 CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化 #ifCAN_RX0_INT_ENABLE CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);//FIFO0消息挂号中断允许. NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//主优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;//次优先级为0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); #endif return0; } #ifCAN_RX0_INT_ENABLE//使能RX0中断 //中断服务函数 voidUSB_LP_CAN1_RX0_IRQHandler(void) { CanRxMsgRxMessage; inti=0; CAN_Receive(CAN1,0,&RxMessage); for(i=0;i<8;i++) printf("rxbuf[%d]: %d\r\n",i,RxMessage.Data[i]); } #endif //can发送一组数据(固定格式: ID为0X12,标准帧,数据帧) //len: 数据长度(最大为8) //msg: 数据指针,最大为8个字节. //返回值: 0,成功; //其他,失败; u8Can_Send_Msg(u8*msg,u8len) { u8mbox; u16i=0; CanTxMsgTxMessage; TxMessage.StdId=0x12;//标准标识符为0 TxMessage.ExtId=0x12;//设置扩展标示符(29位) TxMessage.IDE=0;//使用扩展标识符 TxMessage.RTR=0;//消息类型为数据帧,一帧8位 TxMessage.DLC=len;//发送两帧信息 for(i=0;i TxMessage.Data[i]=msg[i];//第一帧信息 mbox=CAN_Transmit(CAN1,&TxMessage); i=0; while((CAN_TransmitStatus(CAN1,mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++;//等待发送结束 if(i>=0XFFF)return1; return0; } //can口接收数据查询 //buf: 数据缓存区; //返回值: 0,无数据被收到; //其他,接收的数据长度; u8Can_Receive_Msg(u8*buf) { u32i; CanRxMsgRxMessage; if(CAN_MessagePending(CAN1,CAN_FIFO0)==0)return0;//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 期末 复习
![提示](https://static.bdocx.com/images/bang_tan.gif)