A39 STM32_HAL库函数 之 Rcc通用驱动 所有函数的介绍及使用

本文详细介绍了STM32HAL库中的RCC通用驱动函数,包括DeInit、OscConfig、ClockConfig等,以及它们的功能、参数和使用示例,有助于开发人员理解和应用这些功能。
摘要由CSDN通过智能技术生成

1 该驱动函数预览

序号函数名描述
1HAL_RCC_DeInit()反初始化时钟控制模块。
2HAL_RCC_OscConfig()配置时钟源。
3HAL_RCC_ClockConfig()配置系统时钟。
4HAL_RCC_MCOConfig()配置MCO(主时钟输出)。
5HAL_RCC_EnableCSS()启用CSS(时钟安全系统)。
6HAL_RCC_DisableCSS()禁用CSS(时钟安全系统)。
7HAL_RCC_GetSysClockFreq()获取系统时钟频率。
8HAL_RCC_GetHCLKFreq()获取HCLK(AHB总线时钟)频率。
9HAL_RCC_GetPCLK1Freq()获取PCLK1(APB1总线时钟)频率。
10HAL_RCC_GetPCLK2Freq()获取PCLK2(APB2总线时钟)频率。
11HAL_RCC_GetOscConfig()获取时钟源配置。
12HAL_RCC_GetClockConfig()获取时钟配置。
13HAL_RCC_NMI_IRQHandler()NMI中断处理程序。
14HAL_RCC_CSSCallback()CSS(时钟安全系统)中断回调函数。

以下是使用模板:

#include "stm32f4xx_hal.h"

int main(void) {
    // HAL初始化
    HAL_Init();
    
    // 反初始化时钟控制模块
    HAL_RCC_DeInit();
    
    // 配置时钟源
    HAL_RCC_OscConfig();
    
    // 配置系统时钟
    HAL_RCC_ClockConfig();
    
    // 获取系统时钟频率
    HAL_RCC_GetSysClockFreq();
    
    // 获取HCLK(AHB总线时钟)频率
    HAL_RCC_GetHCLKFreq();
    
    // 获取PCLK1(APB1总线时钟)频率
    HAL_RCC_GetPCLK1Freq();
    
    // 获取PCLK2(APB2总线时钟)频率
    HAL_RCC_GetPCLK2Freq();
    
    return 0;
}

1.1 HAL_RCC_DeInit

函数名HAL_RCC_DeInit
函数原形void HAL_RCC_DeInit(void)
功能描述复位RCC设置
输入参数
输出参数
返回值
先决条件
被调用函数

1.2 HAL_RCC_OscConfig

函数名HAL_RCC_OscConfig
函数原形HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
功能描述配置时钟振荡器
输入参数RCC_OscInitStruct:时钟振荡器配置参数
输出参数
返回值HAL_StatusTypeDef:函数执行状态
先决条件
被调用函数

1.3 HAL_RCC_ClockConfig

函数名HAL_RCC_ClockConfig
函数原形HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency)
功能描述配置系统时钟、AHB、APB1和APB2总线时钟
输入参数 1RCC_ClkInitStruct:时钟配置参数
输入参数 2FLatency:Flash延迟配置参数
输出参数
返回值HAL_StatusTypeDef:函数执行状态
先决条件
被调用函数

1.4 HAL_RCC_MCOConfig

函数名HAL_RCC_MCOConfig
函数原形void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_MCODiv)
功能描述配置主时钟输出(MCO)
输入参数 1RCC_MCOx:MCO输出端口编号
输入参数 2RCC_MCOSource:MCO时钟源
输入参数 3RCC_MCODiv:MCO分频器
输出参数
返回值
先决条件
被调用函数

1.5 HAL_RCC_EnableCSS

函数名HAL_RCC_EnableCSS
函数原形void HAL_RCC_EnableCSS(void)
功能描述启用CSS(Clock Security System)
输入参数
输出参数
返回值
先决条件
被调用函数

1.6 HAL_RCC_DisableCSS

函数名HAL_RCC_DisableCSS
函数原形void HAL_RCC_DisableCSS(void)
功能描述禁用CSS(Clock Security System)
输入参数
输出参数
返回值
先决条件
被调用函数

1.7 HAL_RCC_GetSysClockFreq

函数名HAL_RCC_GetSysClockFreq
函数原形uint32_t HAL_RCC_GetSysClockFreq(void)
功能描述获取系统时钟频率
输入参数
输出参数
返回值系统时钟频率
先决条件
被调用函数

1.8 HAL_RCC_GetHCLKFreq

函数名HAL_RCC_GetHCLKFreq
函数原形uint32_t HAL_RCC_GetHCLKFreq(void)
功能描述获取HCLK时钟频率
输入参数
输出参数
返回值HCLK时钟频率
先决条件
被调用函数

1.9 HAL_RCC_GetPCLK1Freq

函数名HAL_RCC_GetPCLK1Freq
函数原形uint32_t HAL_RCC_GetPCLK1Freq(void)
功能描述获取PCLK1时钟频率
输入参数
输出参数
返回值PCLK1时钟频率
先决条件
被调用函数

1.10 HAL_RCC_GetPCLK2Freq

函数名HAL_RCC_GetPCLK2Freq
函数原形uint32_t HAL_RCC_GetPCLK2Freq(void)
功能描述获取PCLK2时钟频率
输入参数
输出参数
返回值PCLK2时钟频率
先决条件
被调用函数

1.11 HAL_RCC_GetOscConfig

函数名HAL_RCC_GetOscConfig
函数原形void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct)
功能描述获取时钟振荡器的配置参数
输入参数RCC_OscInitStruct:时钟振荡器配置参数
输出参数
返回值
先决条件
被调用函数

1.12 HAL_RCC_GetClockConfig

函数名HAL_RCC_GetClockConfig
函数原形void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pFLatency)
功能描述获取时钟树的配置参数
输入参数 1RCC_ClkInitStruct:时钟树配置参数
输入参数 2pFLatency:Flash延迟配置参数
输出参数
返回值
先决条件
被调用函数

1.13 HAL_RCC_NMI_IRQHandler

函数名HAL_RCC_NMI_IRQHandler
函数原形void HAL_RCC_NMI_IRQHandler(void)
功能描述NMI中断服务程序
输入参数
输出参数
返回值
先决条件
被调用函数

1.14 HAL_RCC_CSSCallback

函数名HAL_RCC_CSSCallback
函数原形void HAL_RCC_CSSCallback(void)
功能描述CSS(Clock Security System)中断回调函数
输入参数
输出参数
返回值
先决条件
被调用函数

该文档修改记录:

修改时间修改说明
2024年4月30日第一次发布,介绍了该博客驱动所有函数的介绍及使用

总结

以上就是该博客驱动所有函数的介绍及使用的内容。
有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。
创作不容,如果文档对您有帮助,记得给个赞。

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SM2算法是一种国密算法,它在椭圆曲线密码学的基础上实现了数字签名、密钥交换和加密等功能。下面是一份简单的C++代码实现SM2算法的签名部分。 ```c++ #include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <ctime> #include <cmath> using namespace std; const int SM2_WORD_SIZE = 32; // 定义字节长度为32 // 定义椭圆曲线参数 const string SM2_ELLIPTIC_CURVE = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF"; const string SM2_A = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC"; const string SM2_B = "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93"; const string SM2_N = "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123"; const string SM2_GX = "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE171F9B408F61B2F6"; const string SM2_GY = "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A"; // 定义点结构体 struct SM2_POINT { string x; string y; }; // 定义SM2密钥对结构体 struct SM2_KEYPAIR { string privateKey; SM2_POINT publicKey; }; // 定义SM2签名结构体 struct SM2_SIGNATURE { string r; string s; }; // 生成随机数 string random(int len) { string res = ""; for (int i = 1; i <= len; i++) { int x = rand() % 256; char c = (char)x; res += c; } return res; } // 转换16进制字符串为10进制字符串 string hex2dec(string hex) { string res = ""; for (int i = 0; i < hex.length(); i++) { char c = hex[i]; if (c >= '0' && c <= '9') { res += c; } else if (c >= 'A' && c <= 'F') { int x = c - 'A' + 10; res += to_string(x); } else if (c >= 'a' && c <= 'f') { int x = c - 'a' + 10; res += to_string(x); } } return res; } // 转换10进制字符串为16进制字符串 string dec2hex(string dec) { string res = ""; for (int i = 0; i < dec.length(); i += 2) { int x = dec[i] - '0'; int y = dec[i + 1] - '0'; int z = x * 10 + y; char c; if (z >= 0 && z <= 9) { c = z + '0'; } else { c = z - 10 + 'A'; } res += c; } return res; } // 模运算 string mod(string a, string b) { int len1 = a.length(), len2 = b.length(); if (len1 < len2 || (len1 == len2 && a < b)) { return a; } string res = ""; int carry = 0; for (int i = 0; i < len1; i++) { int x = a[i] - '0'; int y = i < len2 ? b[i] - '0' : 0; int z = x - carry - y; if (z < 0) { z += 10; carry = 1; } else { carry = 0; } res += z + '0'; } while (res.length() > 1 && res[res.length() - 1] == '0') { res.erase(res.length() - 1); } reverse(res.begin(), res.end()); return res; } // 快速幂算法 string pow(string a, string b, string m) { string res = "1"; while (b != "0") { if ((b[b.length() - 1] - '0') % 2 == 1) { res = mod(res * a, m); } a = mod(a * a, m); b = b.substr(0, b.length() - 1); } return res; } // 计算y^2 mod p string modSqrt(string y, string p) { string res = pow(y, (p - "1") / 2, p); return res == "1" ? "0" : "1"; } // 求逆元 string inverse(string a, string p) { string t = "0", newt = "1", r = p, newr = a; while (newr != "0") { string q = mod(r, newr); string temp = t; t = newt; newt = temp - q * newt; temp = r; r = newr; newr = temp - q * newr; } if (r != "1") { return ""; } if (t < "0") { t += p; } return t; } // 生成SM2密钥对 SM2_KEYPAIR generateKeyPair() { srand(time(NULL)); SM2_KEYPAIR res; res.privateKey = random(SM2_WORD_SIZE); string k = hex2dec(res.privateKey); SM2_POINT G; G.x = hex2dec(SM2_GX); G.y = hex2dec(SM2_GY); SM2_POINT P = G; for (int i = 1; i < k.length(); i++) { P = add(P, G); } res.publicKey.x = dec2hex(P.x); res.publicKey.y = dec2hex(P.y); return res; } // 计算椭圆曲线上两点之和 SM2_POINT add(SM2_POINT P, SM2_POINT Q) { SM2_POINT res; string x1 = hex2dec(P.x); string y1 = hex2dec(P.y); string x2 = hex2dec(Q.x); string y2 = hex2dec(Q.y); string a = hex2dec(SM2_A); string p = hex2dec(SM2_ELLIPTIC_CURVE); if (P.x == Q.x && P.y == Q.y) { // P = Q string t1 = mod(a * x1 * x1, p); string t2 = mod(3 * x1 * x1 + a, p); string t3 = mod(inverse(2 * y1, p) * t2, p); string t4 = mod(t3 * t3 - 2 * x1, p); string t5 = mod(x1 - t4, p); string t6 = mod(t3 * (x1 - t4) - y1, p); res.x = dec2hex(t5); res.y = dec2hex(t6); } else if (P.x == Q.x && P.y != Q.y) { // P = -Q res.x = "0"; res.y = "0"; } else { // P != Q string t1 = mod(y2 - y1, p); string t2 = mod(x2 - x1, p); string t3 = mod(inverse(t2, p) * t1, p); string t4 = mod(t3 * t3 - x1 - x2, p); string t5 = mod(x1 - t4, p); string t6 = mod(t3 * (x1 - t4) - y1, p); res.x = dec2hex(t5); res.y = dec2hex(t6); } return res; } // SM2签名 SM2_SIGNATURE sm2Sign(string privateKey, string message) { string k = random(SM2_WORD_SIZE); string d = hex2dec(privateKey); SM2_POINT G; G.x = hex2dec(SM2_GX); G.y = hex2dec(SM2_GY); SM2_POINT P = G; for (int i = 1; i < d.length(); i++) { P = add(P, G); } string n = SM2_N; string e = hex2dec(message); string r, s; while (true) { SM2_POINT C1; C1.x = dec2hex(P.x); C1.y = dec2hex(P.y); string t = mod(e + C1.x, n); if (t == "0" || t == "1") { continue; } string h = modSqrt(t, n); if (h == "1") { continue; } string x = mod(k, n); SM2_POINT C2 = add(mul(G, x), mul(P, hex2dec(k))); string r = mod(mod(e + C1.x, n) + mod(C2.y, n), n); if (r == "0" || r + hex2dec(k) == n) { continue; } s = mod(inverse(1 + hex2dec(privateKey) + hex2dec(k), n) * (hex2dec(k) - r * hex2dec(privateKey)), n); if (s == "0") { continue; } break; } SM2_SIGNATURE res; res.r = dec2hex(r); res.s = dec2hex(s); return res; } int main() { SM2_KEYPAIR keyPair = generateKeyPair(); string message = "Hello, SM2!"; SM2_SIGNATURE signature = sm2Sign(keyPair.privateKey, message); cout << "r: " << signature.r << endl; cout << "s: " << signature.s << endl; return 0; } ``` 以上代码仅实现了SM2算法的签名部分,如果需要实现加密和密钥交换功能,还需要进一步完善代码。此外,由于SM2算法涉及到大量的高精度计算和模运算,因此在实际使用中需要注意代码的效率和精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

常驻客栈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值