嵌入式系统及应用实验报告
《嵌入式系统及应用》课内实验1
- 题目
定时器中断控制流水灯。
- 要求
流水灯按固定的时间流转,我自己加了利用按键中断控制流水灯的启停;
- 电路图
- 仿真图
- 实验的部分程序
main.c文件程序:
#include "stm32f10x.h"
#include "led.h"
#include "exti.h"
#include "time.h"
int main(void)
{
LED_GPIO_Config();
LED_A0(OFF);LED_A1(OFF);LED_A2(OFF);LED_A3(OFF);LED_A4(OFF);
EXTI_Key_Config();
TIM3_Int_Init(499,7199);
while(1)
{
}
}
time.c文件程序:
#include"time.h"
#include "led.h"
#include "stm32f10x.h"
u8 a=1;
u8 flag=1;//1表示亮灯 0表示不亮
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
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_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
if(flag==1)
{
LED_RUN(a);
a=(a+1)%6;
if(a==0) a=1;
}
else
{
LED_RUN(99);
}
flag=flag==1?0:1;
}
}
按键中断:
void EXTI9_5_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line6) != RESET)
{
if(timflag==0)
{
TIM_ITConfig( TIM3, TIM_IT_Update ,DISABLE );
}
else
{
TIM_ITConfig(TIM3, TIM_IT_Update ,ENABLE);
}
timflag=timflag==0?1:0;
EXTI_ClearITPendingBit(EXTI_Line6);
}
}
《嵌入式系统及应用》课内实验2
一、题目
AD转换用led显示。
二、要求
改变电阻led灯发生相应的变化。
三、电路图
四、仿真图
五、实验程序
adc.c文件程序:
#include "adc.h"
void ADC1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE); //使能ADC1,GPIOC时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PC4
}
void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;//ADC结构体变量//注意在一个语句快内变量的声明要放在可执行语句的前面,否则出错,因此要放在ADC1_GPIO_Config();前面
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //使能扫描
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换,不使用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为1
ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);//ADC1选择信道14,音序等级1,采样时间55.5个周期
ADC_Cmd(ADC1, ENABLE);//使能ADC1
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
main.c文件程序:
#include "stm32f10x.h"
#include "usart1.h"
#include "adc.h"
#include "stdio.h"
#include "led.h"
float temp;
int main(void)
{
GPIO_Led_Config();
ADC1_GPIO_Config();
ADC_Config();
while(1)
{
int a,b,c,d,e,f,g,h,i,j,k,l,m;
ADCConvertedValue=ADC_GetConversionValue(ADC1);
a=ADCConvertedValue;
b=a%2;c=(a/2)%2;d=(a/4)%2;e=(a/8)%2;f=(a/16)%2;g=(a/32)%2;h=(a/64)%2;i=(a/128)%2;j=(a/256)%2;k=(a/512)%2;l=(a/1024)%2;m=(a/2048)%2;
if(b==0) GPIO_SetBits(GPIOB,GPIO_Pin_0);
else GPIO_ResetBits(GPIOB,GPIO_Pin_0);
if(c==0) GPIO_SetBits(GPIOB,GPIO_Pin_1);
else GPIO_ResetBits(GPIOB,GPIO_Pin_1);
if(d==0) GPIO_SetBits(GPIOB,GPIO_Pin_2);
else GPIO_ResetBits(GPIOB,GPIO_Pin_2);
if(e==0) GPIO_SetBits(GPIOB,GPIO_Pin_3);
else GPIO_ResetBits(GPIOB,GPIO_Pin_3);
if(f==0) GPIO_SetBits(GPIOB,GPIO_Pin_4);
else GPIO_ResetBits(GPIOB,GPIO_Pin_4);
if(g==0) GPIO_SetBits(GPIOB,GPIO_Pin_5);
else GPIO_ResetBits(GPIOB,GPIO_Pin_5);
if(h==0) GPIO_SetBits(GPIOB,GPIO_Pin_6);
else GPIO_ResetBits(GPIOB,GPIO_Pin_6);
if(i==0) GPIO_SetBits(GPIOB,GPIO_Pin_7);
else GPIO_ResetBits(GPIOB,GPIO_Pin_7);
if(j==0) GPIO_SetBits(GPIOB,GPIO_Pin_8);
else GPIO_ResetBits(GPIOB,GPIO_Pin_8);
if(k==0) GPIO_SetBits(GPIOB,GPIO_Pin_9);
else GPIO_ResetBits(GPIOB,GPIO_Pin_9);
if(l==0) GPIO_SetBits(GPIOB,GPIO_Pin_10);
else GPIO_ResetBits(GPIOB,GPIO_Pin_10);
if(m==0) GPIO_SetBits(GPIOB,GPIO_Pin_11);
else GPIO_ResetBits(GPIOB,GPIO_Pin_11);
}
}