(4)GD32E502C-START 开发板学习——数模转换器(DAC)

一、前言

        这一节先介绍数字/模拟转换器(DAC),下一节再讲解模数转换器(ADC)。DAC可以将12位的数字量转换为对应引脚的模拟电压输出,数据据可以采用8位或12 位模式,左对齐或右对齐模式,其用途也非常多,比如:用DAC电压输出校验ADC采样是否准确、生成自定义波形(正弦波、三角波、方波等),此小节就以生成正弦波为例。   

二、数模转换器介绍(DAC)

      (1)DAC的主要特征如下:

         注意:GD32E502C输入参考电压(V_REF+)可以选择3.3V或5.0V,相同的数字量(0~4095)输出电压就不同。

       (2) DAC结构图如下:

        可以简单理解为有或无外部触发使能的情况下,配置DACDMA功能输出对应的电压。当后面小节介绍了DMA功能后,再加入TIMER定时器和DMA功能输出正弦波(DAC)。

        (3)DAC_OUT引脚的模拟输出电压取决如下公式

                        DAC_OUT = V_REF+ * OUT_DO / 4096

          OUT_DO是数据输出寄存器,数字输入被线性地转换成模拟输出电压,输输出电压范围为0到V_REF

        (4)DAC_OUT输出引脚为PA7

三、配置代码步骤

       配置步骤如下:

        1、定义输出sin函数(数字量),相应的值保存到数组里面

        2、配置DAC(引脚、时钟、使能等)

        3、利用dac_data_set()函数将数组的数据输出

     

        代码展示

#include "gd32e502.h"

#define SIZE_NUMBER 100   //x轴
#define PI 3.1415
uint16_t sin_site[SIZE_NUMBER];   //y轴

//输出电压0-5V   对应数字量0-4095  sin函数:y=0.5*(sin(2pix)+1)
void sin_wave(uint16_t count)
{
	uint16_t i;
	for(i = 0;i < SIZE_NUMBER; i++)
	{
		sin_site[i] = (count>>1)* (sin(2 * PI * i / SIZE_NUMBER)+1);
	}

}

void dac_config(void)
{

	//打开DAC时钟
	rcu_periph_clock_enable(RCU_DAC);
	//打开GPIOE时钟
    rcu_periph_clock_enable(RCU_GPIOA);
	//初始化DAC引脚口  PA7
	gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_7);

	dac_deinit();   //DAC外设复位
	dac_enable();	//DAC使能

}



int main(void)
{
	systick_config();   //使用延时函数
	sin_wave(4095);
    dac_config();
	
    while(1)
	{
		uint16_t i;
		for(i = 0;i < SIZE_NUMBER; i++)
		{
			//DAC输出数据设置
			dac_data_set(DAC_ALIGN_12B_R,sin_site[i]);
			delay_1ms(1);
		}
	}
}

四、效果展示

        正弦波输出正常,且输出电压范围0~5V。

 预告:下一小节来实现ADC采样功能

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是C++实现SHA-1算法的示例代码: ```c++ #include <iostream> #include <iomanip> #include <sstream> #include <string> #include <cstring> #include <cstdint> // 左移循环移位 #define ROTL(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) // SHA-1 常量 #define SHA1_K0 0x5A827999 #define SHA1_K1 0x6ED9EBA1 #define SHA1_K2 0x8F1BBCDC #define SHA1_K3 0xCA62C1D6 // SHA-1 初始化向量 const std::uint32_t SHA1_IV[] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; // SHA-1 消息填充 void sha1_pad(std::string& message) { // 向消息尾部添加一个比特 1 message += '\x80'; // 添加 0 到 64 位填充,使消息长度满足模 512 余 448 std::size_t original_size = message.size(); std::size_t padding_size = (56 - (original_size % 64)) % 64; message.resize(original_size + padding_size, '\0'); // 在消息尾部添加 64 位的原始消息长度 std::uint64_t message_bits = original_size * 8; message.append(reinterpret_cast<const char*>(&message_bits), sizeof(message_bits)); } // SHA-1 压缩函数 void sha1_compress(std::uint32_t* state, const std::uint8_t* block) { // 初始化变量 std::uint32_t a = state[0]; std::uint32_t b = state[1]; std::uint32_t c = state[2]; std::uint32_t d = state[3]; std::uint32_t e = state[4]; std::uint32_t w[80]; // 将 16 个字分组成 80 个字 for (int i = 0; i < 16; i++) { w[i] = (block[i * 4] << 24) | (block[i * 4 + 1] << 16) | (block[i * 4 + 2] << 8) | block[i * 4 + 3]; } for (int i = 16; i < 80; i++) { w[i] = ROTL(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1); } // SHA-1 主循环 for (int i = 0; i < 80; i++) { std::uint32_t f, k; if (i < 20) { f = (b & c) | ((~b) & d); k = SHA1_K0; } else if (i < 40) { f = b ^ c ^ d; k = SHA1_K1; } else if (i < 60) { f = (b & c) | (b & d) | (c & d); k = SHA1_K2; } else { f = b ^ c ^ d; k = SHA1_K3; } std::uint32_t temp = ROTL(a, 5) + f + e + k + w[i]; e = d; d = c; c = ROTL(b, 30); b = a; a = temp; } // 更新状态 state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; } // 计算 SHA-1 哈希值 std::string sha1(const std::string& message) { // 初始化状态 std::uint32_t state[5]; std::memcpy(state, SHA1_IV, sizeof(SHA1_IV)); // 对消息进行填充 std::string padded_message = message; sha1_pad(padded_message); // 对填充后的消息进行压缩 for (std::size_t i = 0; i < padded_message.size(); i += 64) { sha1_compress(state, reinterpret_cast<const std::uint8_t*>(&padded_message[i])); } // 将结果转换为十六进制字符串 std::ostringstream oss; oss << std::hex << std::setfill('0'); for (int i = 0; i < 5; i++) { oss << std::setw(8) << state[i]; } return oss.str(); } // 测试 int main() { std::cout << sha1("Hello, world!") << std::endl; // 0x7b502c3a1f48c860e3c0feeb6a1c9a22d1aee6cb return 0; } ``` 在该实现中,`sha1()` 函数接受一个字符串作为输入,并返回该字符串的 SHA-1 哈希值。哈希值以十六进制字符串的形式返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值