波形生成设计

本文介绍了一个简单的嵌入式波形生成器设计,包括方波的生成及输出控制。通过STM32F10x系列微控制器的定时器模块实现波形输出,并提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

1 波形生成设计

功能非常简单,直接上代码:

WaveGen.h:

/**
 * @brief 波形生成器实现
 * @details
 * @author 01课堂 李述铜 http://01ketang.cc
 * @date 2017-06-01
 * @version 1.0
 * @copyright 版权所有,禁止用于商业用途
 */
#ifndef WAVEGEN_H
#define WAVEGEN_H

typedef enum {
    WaveSquare,
    WaveUnknown,
}WaveType;

void WaveGenInit (void);
uint32_t WaveSelectType (WaveType type);
uint32_t WaveSquareSet (uint32_t highMs, uint32_t lowMs);
uint32_t WaveStartOutput (void);
void WaveStopOutput (void);

#endif //WAVEGEN_H

WaveGen.h:

/**
 * @brief 波形生成器实现
 * @details
 * @author 01课堂 李述铜 http://01ketang.cc
 * @date 2017-06-01
 * @version 1.0
 * @copyright 版权所有,禁止用于商业用途
 */
#include "tinyOS.h"
#include "WaveGen.h"
#include "stm32f10x_tim.h"              // Keil::Device:StdPeriph Drivers:TIM


static WaveType currentWaveType = WaveUnknown;
static tMutex mutex;

/**
 * 波形输出硬件初始化
 */
void WaveGenHalInit (void) {
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //打开APB2外设
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //开时钟
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;    //PA6 PA7
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //要改为 AF_PP
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_DeInit(TIM3);                           //将TIM3寄存器设为缺省值
    TIM_TimeBaseStructure.TIM_Period = 72 - 1;   //ARR的值,计数周期
    TIM_TimeBaseStructure.TIM_Prescaler = 36 - 1;      //分频  CK_INT=2MHz 36分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);    //初始化定时器3

    //通道1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
    TIM_OCInitStructure.TIM_Pulse = 1 - 1;      //待捕获比较寄存器的值  CRR
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;    //高电平有效
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);     //通道初始化
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //预装载使能
}

/**
 * 初始化波形输出
 */
void WaveGenInit (void) {
    WaveGenHalInit();

    currentWaveType = WaveUnknown;
    tMutexInit(&mutex);
}

/**
 * 选择波形输出类型
 * @param type 输出类型
 */
uint32_t WaveSelectType (WaveType type) {
    uint32_t err = 0;

    tMutexWait(&mutex, 0);

    switch (type) {
        case WaveSquare:
            currentWaveType = type;
            err = 0;
            break;
        default:
            err = 1;
            break;
    }

    tMutexNotify(&mutex);
}

/**
 * 设置方波的输出高低电平时间
 * @param highMs 高电平持续时间,ms为单位
 * @param lowMs 低电平持续时间,ms为单位
 */
uint32_t WaveSquareSet (uint32_t highMs, uint32_t lowMs) {
    return 0;
}

/**
 * 启动波形输出
 */
uint32_t WaveStartOutput (void) {
    uint32_t err = 0;

    tMutexWait(&mutex, 0);

    switch (currentWaveType) {
        case WaveSquare:
            TIM3->CNT = 0;
            TIM_Cmd(TIM3, ENABLE);//打开定时器
            err = 0;
        default:
            err = 1;
    }
    tMutexNotify(&mutex);

    return err;
}

/**
 * 停止波形输出
 */
void WaveStopOutput (void) {
    tMutexWait(&mutex, 0);
    switch (currentWaveType) {
        case WaveSquare:
            TIM3->CNT = 0;
            TIM_Cmd(TIM3, DISABLE);
            break;
        default:
            break;
    }
    tMutexNotify(&mutex);
}

app.c:

/**
 * @brief tOS应用示例
 * @details
 * @author 01课堂 李述铜 http://01ketang.cc
 * @date 2017-06-01
 * @version 1.0
 * @copyright 版权所有,禁止用于商业用途
 */
#include "tinyOS.h"
#include "app.h"
#include "hal.h"

#include "button.h"
#include "uart.h"
#include "extio.h"
#include "WaveGen.h"

static tTaskStack task1Env[TASK1_ENV_SIZE];     // 任务1的堆栈空间
static tTask task1;

void task1Entry (void * param) {
    WaveSelectType(WaveSquare);
    
    for (;;) {
        WaveStartOutput();
        tTaskDelay(10);
        WaveStopOutput();
        tTaskDelay(10);
    }
}

/**
 * App的初始化
 */
void tInitApp (void) {
    halInit();

    ButtonInit();
    UartInit();
    ExtIOInit();
    WaveGenInit();

    tTaskInit(&task1, task1Entry, (void *) 0x0, TASK1_PRIO, task1Env, sizeof(task1Env));
}



参考资料:

  1. 手把手教你学用嵌入式操作系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值