技术标签: 单片机
ARM公司设计的处理器内核有很多种,根据不同的应用场景和性能需求,可以选择不同的内核进行设计。以下是一些常见的ARM内核:
Cortex-M系列是ARM公司推出的一种面向低功耗嵌入式系统的处理器内核,主要用于智能传感器、便携式设备、家用电器等领域。Cortex-M系列内核具有低功耗、低成本、高效能、易于开发等特点,是目前嵌入式系统领域最受欢迎的处理器内核之一。根据不同的性能和功耗需求,Cortex-M系列内核又分为以下几类:
rcu_periph_clock_enable(RCU_GPIOx);
gpio_mode_set(GPIOx, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_x);
gpio_output_options_set(GPIOx, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, GPIO_PIN_x);
rcu_periph_clock_enable(RCU_GPIOx);
gpio_mode_set(GPIOx, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_x);
gpio_output_options_set(GPIOx, GPIO_OTYPE_OD, GPIO_OSPEED_MAX, GPIO_PIN_x);
rcu_periph_clock_enable(RCU_GPIOx);
gpio_mode_set(GPIOx, GPIO_MODE_OUTPUT, GPIO_PUPD_PULLUP, GPIO_PIN_x);
gpio_output_options_set(GPIOx, GPIO_OTYPE_OD, GPIO_OSPEED_MAX, GPIO_PIN_x);
rcu_periph_clock_enable(RCU_GPIOx);
gpio_mode_set(GPIOx, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_x);
rcu_periph_clock_enable(RCU_GPIOx);
gpio_mode_set(GPIOx, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_x);
FlagStatus state = gpio_input_bit_get(GPIOx, GPIO_PIN_x);
Usart0.h
#ifndef __USART0_H__
#define __USART0_H__
#include "gd32f4xx.h"
#include <stdio.h>
#define USART0_RX_ENABLE 1
void Usart0_init();
void Usart0_send_byte(uint8_t data);
void Usart0_send_string(char* data);
#if USART0_RX_ENABLE
extern void Usart0_recv(uint8_t* data, uint32_t len);
#endif
#endif
Usart.c
#include "Usart0.h"
#if USART0_RX_ENABLE
#define USART_RECEIVE_LENGTH 1024
//串口接收缓冲区大小
uint8_t g_recv_buff[USART_RECEIVE_LENGTH]; // 接收缓冲区
//接收到字符存放的位置
uint32_t g_recv_length = 0;
#endif
//1. 初始化
void Usart0_init() {
// 哪个串口
uint32_t usartx = USART0;
uint32_t usartx_rcu = RCU_USART0;
uint32_t usartx_irq = USART0_IRQn;
// 波特率
uint32_t usartx_p_baudrate = 115200;
// tx和rx,用了哪个引脚
uint32_t usartx_tx_port_rcu = RCU_GPIOA;
uint32_t usartx_tx_port = GPIOA;
uint32_t usartx_tx_pin = GPIO_PIN_9;
// 复用功能编号
uint32_t usartx_tx_af = GPIO_AF_7;
// tx和rx,用了哪个引脚
uint32_t usartx_rx_port_rcu = RCU_GPIOA;
uint32_t usartx_rx_port = GPIOA;
uint32_t usartx_rx_pin = GPIO_PIN_10;
// 复用功能编号
uint32_t usartx_rx_af = GPIO_AF_7;
/*************** gpio *****************/
// TX
// 配置时钟
rcu_periph_clock_enable(usartx_tx_port_rcu);
// 配置模式: 复用功能
gpio_mode_set(usartx_tx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_tx_pin);
// 配置复用功能
gpio_af_set(usartx_tx_port, usartx_tx_af, usartx_tx_pin);
gpio_output_options_set(usartx_tx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_tx_pin);
// RX
// 配置时钟
rcu_periph_clock_enable(usartx_rx_port_rcu);
gpio_mode_set(usartx_rx_port, GPIO_MODE_AF, GPIO_PUPD_NONE, usartx_rx_pin);
gpio_af_set(usartx_rx_port, usartx_rx_af, usartx_rx_pin);
// 配置输出参数
gpio_output_options_set(usartx_rx_port, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, usartx_rx_pin);
/*************** usart ****************/
// 串口时钟
rcu_periph_clock_enable(usartx_rcu);
// USART复位
usart_deinit(usartx);
// 波特率
usart_baudrate_set(usartx, usartx_p_baudrate);
// 校验位
usart_parity_config(usartx, USART_PM_NONE);
// 数据位数
usart_word_length_set(usartx, USART_WL_8BIT);
// 停止位
usart_stop_bit_set(usartx, USART_STB_1BIT);
// 先发送高位还是低位
usart_data_first_config(usartx, USART_MSBF_LSB);
// 发送功能配置
usart_transmit_config(usartx, USART_TRANSMIT_ENABLE);
#if USART0_RX_ENABLE
// 接收功能配置
usart_receive_config(usartx, USART_RECEIVE_ENABLE);
// 接收中断配置
nvic_irq_enable(usartx_irq, 2, 2);
// usart int rbne
usart_interrupt_enable(usartx, USART_INT_RBNE);
usart_interrupt_enable(usartx, USART_INT_IDLE);
#endif
// 使能串口
usart_enable(usartx);
}
//2. 发送
void Usart0_send_byte(uint8_t data) {
//通过USART发送
usart_data_transmit(USART0, data);
//判断缓冲区是否已经空了
//FlagStatus state = usart_flag_get(USART_NUM,USART_FLAG_TBE);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}
void Usart0_send_string(char* data) {
while(data && *data) {
Usart0_send_byte((uint8_t)(*data));
data++;
}
}
// printf打印功能
int fputc(int ch, FILE *f){
Usart0_send_byte((uint8_t)ch);
return ch;
}
#if USART0_RX_ENABLE
// 名称不能随意改,串口0的中断,就是这个名字
void USART0_IRQHandler(void) {
if ((usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) == SET) {
uint16_t value = usart_data_receive(USART0);
g_recv_buff[g_recv_length] = value;
g_recv_length++;
}
if (usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) == SET) {
//读取缓冲区,清空缓冲区
usart_data_receive(USART0);
g_recv_buff[g_recv_length] = '\0';
// TODO: g_recv_buff为接收的数据,g_recv_length为接收的长度
// printf("recv: %s\r\n", g_recv_buff);
Usart0_recv(g_recv_buff, g_recv_length);
g_recv_length = 0;
}
}
#endif
static void EXTI_config() {
uint32_t extix = EXTI_0;
uint32_t extix_irq = EXTI0_IRQn;
uint32_t extix_irq_pre = 1;
uint32_t extix_irq_sub = 1;
uint32_t extix_trig = EXTI_TRIG_BOTH;
uint32_t extix_rcu = RCU_GPIOA;
uint32_t extix_port = GPIOA;
uint32_t extix_pin = GPIO_PIN_0;
uint32_t extix_pupd = GPIO_PUPD_NONE;
uint32_t extix_src_port = EXTI_SOURCE_GPIOA;
uint32_t extix_src_pin = EXTI_SOURCE_PIN0;
/*************** gpio ****************/
// PA0,
// 时钟初始化
rcu_periph_clock_enable(extix_rcu);
// 配置GPIO模式
gpio_mode_set(extix_port, GPIO_MODE_INPUT, extix_pupd, extix_pin);
/*************** exti ****************/
// 时钟配置
rcu_periph_clock_enable(RCU_SYSCFG);
// 配置中断源
syscfg_exti_line_config(extix_src_port, extix_src_pin);
// 中断初始化
exti_init(extix, EXTI_INTERRUPT, extix_trig);
// 配置中断优先级
nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
// 使能中断
exti_interrupt_enable(extix);
// 清除中断标志位
exti_interrupt_flag_clear(extix);
}
static void EXTI_config() {
uint32_t extix = EXTI_0;
uint32_t extix_irq = EXTI0_IRQn;
uint32_t extix_irq_pre = 1;
uint32_t extix_irq_sub = 1;
uint32_t extix_trig = EXTI_TRIG_BOTH;
uint32_t extix_rcu = RCU_GPIOA;
uint32_t extix_port = GPIOA;
uint32_t extix_pin = GPIO_PIN_0;
uint32_t extix_pupd = GPIO_PUPD_NONE;
uint32_t extix_src_port = EXTI_SOURCE_GPIOA;
uint32_t extix_src_pin = EXTI_SOURCE_PIN0;
/*************** gpio ****************/
// PA0,
// 时钟初始化
rcu_periph_clock_enable(extix_rcu);
// 配置GPIO模式
gpio_mode_set(extix_port, GPIO_MODE_INPUT, extix_pupd, extix_pin);
/*************** exti ****************/
// 时钟配置
rcu_periph_clock_enable(RCU_SYSCFG);
// 配置中断源
syscfg_exti_line_config(extix_src_port, extix_src_pin);
// 中断初始化
exti_init(extix, EXTI_INTERRUPT, extix_trig);
// 配置中断优先级
nvic_irq_enable(extix_irq, extix_irq_pre, extix_irq_sub);
// 使能中断
exti_interrupt_enable(extix);
// 清除中断标志位
exti_interrupt_flag_clear(extix);
}
类型 |
编号 |
引脚 |
计数模式 |
互补和死区 |
|||
正极性 |
负极性 |
||||||
高级 |
定时器0 |
复用AF1 |
CH0 |
PA7 ON,PA8,PB13 ON |
向上 |
PA8 |
PA7 ONPB13 ON |
CH1 |
PA9,PB0 ON,PB14 ON, |
PA9 |
PB0 ONPB14 ON |
||||
CH2 |
PA10,PB1 ON,PB15 ON |
PA10 |
PB1 ONPB15 ON |
||||
CH3 |
PA11,PE14 |
||||||
BRKIN |
PA06,PB12,PE15 |
||||||
ETI |
PE7 |
||||||
定时器7 |
复用AF3 |
CH0 |
PA5 ON,PA7 ON,PC6 |
向上 |
PC6 |
PA5 ONPA7 ON |
|
CH1 |
PB0 ON,PB14 ON,PC7, |
PC7 |
PB0 ONPB14 ON |
||||
CH2 |
PB1 ON,PB15 ON,PC8, |
PC8 |
PB1 ONPB15 ON |
||||
CH3 |
PC9,PI2 |
NONE |
|||||
BRKIN |
PA6,PI4 |
||||||
ETI |
PA0,PI3 |
||||||
通用(L0) |
定时器1 |
复用AF1 |
CH0 |
PA0,PA5,PA15,PB8 |
向上 |
||
CH1 |
PA1,PB3,PB9 |
||||||
CH2 |
PA2,PB10 |
||||||
CH3 |
PA3,PB2,PB11 |
||||||
ETI |
PB8 |
||||||
定时器2 |
复用AF2 |
CH0 |
PA6,PB4,PC6 |
向上 |
|||
CH1 |
PA7,PB5,PC7 |
||||||
CH2 |
PB0,PC8 |
||||||
CH3 |
PB1,PC9 |
||||||
ETI |
PD2 |
||||||
定时器3 |
复用AF2 |
CH0 |
PB6,PD12 |
向上 |
|||
CH1 |
PB7,PD13 |
||||||
CH2 |
PB8,PD14 |
||||||
CH3 |
PB9,PD15 |
||||||
ETI |
PE0 |
||||||
定时器4 |
复用AF2 |
CH0 |
PA0,PH10 |
向上 |
|||
CH1 |
PA1,PH11 |
||||||
CH2 |
PA2,PH12 |
||||||
CH3 |
PA3,PI0 |
||||||
通用(L1) |
定时器8 |
复用AF3 |
CH0 |
PA2,PE5 |
向上 |
||
CH1 |
PA3,PE6 |
||||||
定时器11 |
复用AF9 |
CH0 |
PB14,PH6 |
向上 |
|||
CH1 |
PB15,PH7 |
||||||
通用(L2) |
定时器9 |
复用AF3 |
CH0 |
PB8,PF6 |
向上 |
||
定时器10 |
复用AF3 |
CH0 |
PB9,PF7 |
向上 |
|||
定时器12 |
复用AF9 |
CH0 |
PA6,PF8 |
向上 |
|||
定时器13 |
复用AF9 |
CH0 |
PA7,PF9 |
向上 |
|||
基本 |
定时器5 |
倍频4 |
NONE |
向上 |
|||
定时器6 |
倍频4 |
向上 |
SCL |
SDA |
TXFRAME |
SMBA |
|
|
|
|
|
|
|
|
|
|
|
|
通道 |
ADC0 |
ADC1 |
ADC2 |
|
外部通道 |
IN0 |
PA0 |
PA0 |
PA0 |
IN1 |
PA1 |
PA1 |
PA1 |
|
IN2 |
PA2 |
PA2 |
PA2 |
|
IN3 |
PA3 |
PA3 |
PA3 |
|
IN4 |
PA4 |
PA4 |
PF6 |
|
IN5 |
PA5 |
PA5 |
PF7 |
|
IN6 |
PA6 |
PA6 |
PF8 |
|
IN7 |
PA7 |
PA7 |
PF9 |
|
IN8 |
PB0 |
PB0 |
PF10 |
|
IN9 |
PB1 |
PB1 |
PF3 |
|
IN10 |
PC0 |
PC0 |
PC0 |
|
IN11 |
PC1 |
PC1 |
PC1 |
|
IN12 |
PC2 |
PC2 |
PC2 |
|
IN13 |
PC3 |
PC3 |
PC3 |
|
IN14 |
PC4 |
PC4 |
PF4 |
|
IN15 |
PC5 |
PC5 |
PF5 |
|
内部通道 |
IN16 |
温度 |
||
IN17 |
Vref |
|||
电池电压通道 |
IN18 |
VBAT |
MOSI |
MISO |
SCK |
NSS |
|
SPI0 |
PA7 |
PA6 |
PA5 |
PA4 |
PB5 |
PB4 |
PB3 |
PA15 |
|
SPI1 |
PB15 |
PB14 |
PA9 |
PB9 |
PC1 |
PC2 |
PB10 |
PB12 |
|
PC3 |
PI2 |
PB13 |
PD1 |
|
PI3 |
PC7 |
PI0 |
||
PD3 |
||||
PI1 |
||||
SPI2 |
PB0 |
PB4 |
PB3 |
PA4 |
PB2 |
PC11 |
PC10 |
PA15 |
|
PB5 |
||||
PC1 |
||||
PC12 |
||||
PD0 |
||||
PD6 |
||||
SPI3 |
PA1 |
PA11 |
PB13 |
PB12 |
PE6 |
PD0 |
PE2 |
PE4 |
|
PE14 |
PE5 |
PE12 |
PE11 |
|
PG13 |
PE13 |
PG11 |
PG14 |
|
PG12 |
||||
SPI4 |
PA10 |
PA12 |
PB0 |
PB1 |
PB8 |
PE13 |
PE12 |
PE11 |
|
PE14 |
PF8 |
PF7 |
PF6 |
|
PF9 |
PH7 |
PH6 |
PH5 |
|
PF11 |
||||
SPI5 |
PG14 |
PG12 |
PG13 |
PG8 |
SPI5_IO2: PG10 |
SPI5_IO3: PG11 |
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"
void Usart0_on_recv(uint8_t* data, uint32_t len) {
printf("recv: %s\r\n", data);
}
static void wtd_config() {
fwdgt_config(2 * 500, FWDGT_PSC_DIV64);
fwdgt_enable();
}
int main(void)
{
systick_config();
Usart0_init();
wtd_config();
printf("start\r\n");
while(1) {
delay_1ms(960);
/* reed dog */
fwdgt_counter_reload();
}
}
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "Usart0.h"
void Usart0_on_recv(uint8_t* data, uint32_t len) {
printf("recv: %s\r\n", data);
}
static void wtd_config() {
rcu_periph_clock_enable(RCU_WWDGT);
/*
* System clock up to 240Mhz, PCLK1=60MHz
* set WWDGT clock = (PCLK1 (60MHz)/4096)/4 = 3662Hz (~273 us)
* set counter value to 127
* set window value to 80
* refresh window is: ~273 * (127-80)= 5.9ms < refresh window < ~273 * (127-0x3F) =17.5ms.
*/
wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV4);
wwdgt_enable();
}
int main(void)
{
systick_config();
Usart0_init();
wtd_config();
printf("start\r\n");
while(1) {
delay_1ms(13);
/* update WWDGT counter */
wwdgt_counter_update(127);
}
}
文章浏览阅读1.1k次。一、选择题1. 串行接口是指( )。A. 接口与系统总线之间串行传送,接口与I/0设备之间串行传送B. 接口与系统总线之间串行传送,接口与1/0设备之间并行传送C. 接口与系统总线之间并行传送,接口与I/0设备之间串行传送D. 接口与系统总线之间并行传送,接口与I/0设备之间并行传送【答案】C2. 最容易造成很多小碎片的可变分区分配算法是( )。A. 首次适应算法B. 最佳适应算法..._874 计算机科学专业基础综合题型
文章浏览阅读9.7k次,点赞5次,收藏15次。连接xshell失败,报错如下图,怎么解决呢。1、通过ps -e|grep ssh命令判断是否安装ssh服务2、如果只有客户端安装了,服务器没有安装,则需要安装ssh服务器,命令:apt-get install openssh-server3、安装成功之后,启动ssh服务,命令:/etc/init.d/ssh start4、通过ps -e|grep ssh命令再次判断是否正确启动..._could not connect to '192.168.17.128' (port 22): connection failed.
文章浏览阅读209次。00000000_杰理 空白芯片 烧入key文件
文章浏览阅读475次。2023年初,“ChatGPT”一词在社交媒体上引起了热议,人们纷纷探讨它的本质和对社会的影响。就连央视新闻也对此进行了报道。作为新传专业的前沿人士,我们当然不能忽视这一热点。本文将全面解析ChatGPT,打开“技术黑箱”,探讨它对新闻与传播领域的影响。_引发对chatgpt兴趣的表述
文章浏览阅读259次。用Python数据分析方法进行汉字声调频率统计分析木合塔尔·沙地克;布合力齐姑丽·瓦斯力【期刊名称】《电脑知识与技术》【年(卷),期】2017(013)035【摘要】该文首先用Python程序,自动获取基本汉字字符集中的所有汉字,然后用汉字拼音转换工具pypinyin把所有汉字转换成拼音,最后根据所有汉字的拼音声调,统计并可视化拼音声调的占比.【总页数】2页(13-14)【关键词】数据分析;数据可..._汉字声调频率统计
文章浏览阅读64次。最近在做一个android系统移植的项目,所使用的开发板com1是调试串口,就是说会有uboot和kernel的调试信息打印在com1上(ttySAC0)。因为后期要使用ttySAC0作为上层应用通信串口,所以要把所有的调试信息都给去掉。参考网上的几篇文章,自己做了如下修改,终于把调试信息重定向到ttySAC1上了,在这做下记录。参考文章有:http://blog.csdn.net/longt..._嵌入式rootfs 输出重定向到/dev/console
文章浏览阅读1.2k次,点赞4次,收藏12次。1,先去iconfont登录,然后选择图标加入购物车 2,点击又上角车车添加进入项目我的项目中就会出现选择的图标 3,点击下载至本地,然后解压文件夹,然后切换到uniapp打开终端运行注:要保证自己电脑有安装node(没有安装node可以去官网下载Node.js 中文网)npm i -g iconfont-tools(mac用户失败的话在前面加个sudo,password就是自己的开机密码吧)4,终端切换到上面解压的文件夹里面,运行iconfont-tools 这些可以默认也可以自己命名(我是自己命名的_uniapp symbol图标
文章浏览阅读1.2w次,点赞25次,收藏192次。char*和char[]都是指针,指向第一个字符所在的地址,但char*是常量的指针,char[]是指针的常量_c++ char*
文章浏览阅读930次。代码编辑器或者文本编辑器,对于程序员来说,就像剑与战士一样,谁都想拥有一把可以随心驾驭且锋利无比的宝剑,而每一位程序员,同样会去追求最适合自己的强大、灵活的编辑器,相信你和我一样,都不会例外。我用过的编辑器不少,真不少~ 但却没有哪款让我特别心仪的,直到我遇到了 Sublime Text 2 !如果说“神器”是我能给予一款软件最高的评价,那么我很乐意为它封上这么一个称号。它小巧绿色且速度非
文章浏览阅读4.1k次。一、选择法这是每一个数出来跟后面所有的进行比较。2.冒泡排序法,是两个相邻的进行对比。_对十个数进行大小排序java
文章浏览阅读2.9k次。物联网开发笔记——使用网络调试助手连接阿里云物联网平台(基于MQTT协议)其实作者本意是使用4G模块来实现与阿里云物联网平台的连接过程,但是由于自己用的4G模块自身的限制,使得阿里云连接总是无法建立,已经联系客服返厂检修了,于是我在此使用网络调试助手来演示如何与阿里云物联网平台建立连接。一.准备工作1.MQTT协议说明文档(3.1.1版本)2.网络调试助手(可使用域名与服务器建立连接)PS:与阿里云建立连解释,最好使用域名来完成连接过程,而不是使用IP号。这里我跟阿里云的售后工程师咨询过,表示对应_网络调试助手连接阿里云连不上
文章浏览阅读544次,点赞5次,收藏6次。运算符与表达式任何高级程序设计语言中,表达式都是最基本的组成部分,可以说C++中的大部分语句都是由表达式构成的。_无c语言基础c++期末速成