嵌入式技术与应用开发

一、LED闪烁控制设计与实现

     在任务2的基础上,编写程序控制STM32F103VCT6的PB8引脚,能交替输出高电平和低电平,完成LED闪烁控制程序的设计与调试。
    LED闪烁控制电路同“点亮一个LED”电路 一样,LED的阳极经100Ω限流电阻接电源,PB8引脚接LED的阴极。

1.LED闪烁功能实现分析

    LED的阳极通过1002限流电阻连接到电源上,PB8引脚接LED的阴极。PB8引脚输出低电平时,LED点亮;输出高电平时,LED熄灭。LED闪烁功
(1)PB8引脚输出低电平,LED点亮。
(2)延时。
(3)PB8引脚输出高电平,LED熄灭。
(4)延时。
(5)重复第一步(循环),这样就可以实现LED闪烁。

2.移植工程模板

(1)建立一个“任务3LED闪烁控制”工程目录,然后把 STM32_Project工程模板直接复制到该目录下。
(2)在“任务3LED闪烁控制”工程目录下,将工程模板目录名 STM32_Project 修改为“LEl
闪烁控制”。
(3)在USER子目录下,把STM32_Project.uvproj 工程名修改为 ledss.uvproj。

3.LED闪烁控制程序设计

根据以上分析,编写LED闪烁控制主文件ledss.c,LED闪烁控制主要代码如下。

#include "stm32f10x.h"

void Delay(unsigned int count)      //延时函数
{
    unsigned int i;
    for(; count != 0; count--)
    {
        i=5000;
        while(i--)
    }
}
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 使能 GPIOB 时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;             // PB8 引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     // 配置 PB8 为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   // GPIOB 速度为 50 MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);             // 初始化 PB8
    GPIO_SetBits(GPIOB, GPIO_Pin_8);                  // PB8 输出高电平,LED 熄灭

    while(1)
    {
        GPIO_ResetBits(GPIOB, GPIO_Pin_8);          // PB8 输出低电平,LED 点亮
        Delay(100);                                // 延时,保持点亮一段时间
        GPIO_SetBits(GPIOB, GPIO_Pin_8);          // 延时,保持熄灭一段时间
        Delay(100);
    }
}

代码说明:

由于STM32执行指令的速度非常快,如果不设置延时,LED点亮之后马上就熄灭,熄灭之后马上又点亮,速度太快。由于人眼存在视觉暂留效应,根本无法分辨。所以我们在控制LED闪烁的时候需要延时一段时间,否则就看不到“LED闪烁”的效果了。

4.工程编译与调试

  参考任务2把ledss.c主文件添加到工程里面,把Project Targets栏下的STM32_Project名修改为ledss,完成“LED闪烁控制”工程的搭建、配置。

   单击Rebuild按钮对工程进行编译,生成ledss.hex目标代码文件。若编译发生错误,要进行分析检查,直到编译正确。

   加载 ledss.hex 目标代码文件到STM32F103R6芯片,单击仿真工具栏的“运行”按钮,观察LED是否闪烁。若运行结果与任务要求不一致,要对电路和程序进行分析检查,直到运行正确

二、extern变量声明

  C语言中的exter可以置于变量/函数前,表示该变量/函数已在别的文件中定义过,用于提示编译器,遇到此变量和函数时在其他文件中寻找其定义,如:

extern ul6 USART_RX_STA;

  这个语句是声明USART_RX_STA变量在其他文件中已经定义了,在这里要使用到。所以,
肯定可以在其他文件的某个地方,找到该变量的定义语句。

u16 USART_RX_STA;

   下面通过一段代码来说明extern的使用方法。在 main.c中定义全局变量id,id的初始化是
在main.c中进行的。main.c文件如下:

u8 id;                            //定义只允许一次
int main(void)
{
    id = 1;
    printf("id=%d", id);         // id = 1 
    test(); 
    printf("id=%d", id);        // id = 2
}

  但是,我们在test.c文件中的test(void)函数中也要使用变量id,这个时候就需要在test.c里面去声明变量id是外部定义的了。因为如果不声明,变量id的作用域是到不了test.c文件中的。看下面test.c文件中的代码:

extern u8 id; // 声明变量 id 是在外部定义的,声明可以在很多个文件中进行
void test(void)
{
    id = 2;
}

  在 test.c文件中声明变量id是在函数void test(void)外部定义的,然后就可以使用变量id了。

三、音频产生器

1.音频控制电路

  音频控制电路由STM32F103R6芯片、电阻、扬声器和三极管2N3392组成,其中,VT1的基极经电阻R1接到PC5引脚,如图所示。

2.编写音频产生器程序

音频产生器程序和任务3的LED闪烁程序基本一样,主文件ypcsq.c可参考如下程序。

#include "stm32f10x.h"
void Delay (unsigned int count)    //延时函数
{
    unsigned int i;
    for(;count!=0;count--)
    {
        i=5000;
        while(i--);
    }
}
int main(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOC, ENABLE); //使能GPIOC时
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;              //PC5引脚配置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //配置 PC5 为推挽输
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //GPIOB 速度为50M                               
    GPIO_Init(GPIOC, &GPIO_InitStructure);                 //初始化PC5
    GPIO_SetBits(GPIOC,GPIO_Pin_5);                        //PC5输出高电平

    while(1)
    {

    GPIO_ResetBits(GPIOC,GPIO_Pin_5);               //PC5输出低电平
    Delay(10);                                    //延时一段时间
    GPIO_SetBits(GPIOC,GPIO_Pin_5);                 //PC5输出高电平
    Delay(10);
    }
}

3.工程编译与调试

     把ypcsq.c主文件添加到工程里面,修改工程名为ypCSq,完成“音频产生器”工程的搭建、配置。单击Rebuild西按钮对工程进行编译,生成ypcsq.hex目标代码文件,直到编译正确。

     最后加载 ypcsq.hex 目标代码文件到STM32F103R6芯片,单击仿真工具栏的“运行”按钮》,观察运行结果是否与要求一致,如不一致,则要对电路和程序进行分析检查,直到运行正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值