技术标签: 单片机
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);
}
}
文章浏览阅读4.2w次,点赞329次,收藏2.7k次。Python 入门的60个基础练习_练习python基础语法
文章浏览阅读1w次。用Xcode5运行一下应用,第一个看到的就是status bar的变化。在iOS6中,status bar是系统在处理,应用_ios7 statusbar
文章浏览阅读2.1k次。问题描述:,在gdb调试程序输出变量:p var,会提示No symbol "var" in current context.原因:程序编译时开启了优化选项,那么在用GDB调试被优化过的程序时,可能会发生某些变量不能访问,或是取值错误码的情况。这个是很正常的,因为优化程序会删改程序,整理程序的语句顺序,剔除一些无意义的变量等,所以在GDB调试这种程序时,运行时的指令和你所编写指_no registers调试显示
文章浏览阅读3.4k次。import java.util.Random;import org.drools.util.UUIDGenerator;/** * * * 类名称:GenerateIdUtil * 类描述: 主键生成工具类 * @author chenly * 创建时间:Jul 10, 2012 8:10:43 AM * 修改人: * 修改时间:Jul 10, 2012 8..._idgeneratorutils.generateid()
文章浏览阅读5k次。BX:跳转到寄存器reg给出的目的地址处,如:BX R2BLX:跳转到寄存区reg给出的目的地址处并将返回地址存储到LR(R14)使用这两个指令时有一点特别需要注意:跳转的目的地址必须是奇数,若不是奇数则在后面加1,如某函数的起始地址是0x80000f00,则要跳转到此函数则应该跳转到0x80000f01处!否则会进入硬件错误中断!..._汇编blx
文章浏览阅读2.6k次,点赞2次,收藏4次。vue打包后,其实就剩index.html和一堆静态资源,页面的加载和替换都是通过刷新index.html种的dom来实现的(应该是这样,可能表述不是很好),所以做个重定向就可以了。(博主是这么解决的,网上还有很多人是各种路径错误,大家可以尝试下自己是哪个原因)import org.springframework.boot.web.server.ConfigurableWebServerFa..._前端项目放入resource
文章浏览阅读9.7k次。1.问题展示2.解决方案1.任意窗口, 打开git bash2.命令行界面, 输入cd C:3.cat ~/.ssh/id_rsa.pub正常下面应该显示一大串公钥如果没有,显示如下图, 则进行下一步, 创建公钥4.创建公钥, 输入 ssh-keygen5.然后一直下一步, 直到出现6.再次输入cat ~/.ssh/id_rsa.pub下面一大串数字便是公钥,复制这些字符串, 打开github, 点击头像, 打开settings, 打开SSH and GPG Keys_cmd warning: permanently added
文章浏览阅读154次。[code="java"]1. SQL/Plus 常用命令 a. help [topic] 查看命令的使用方法,topic表示需要查看的命令名称。 如: help desc; b. host 该命令可以从SQL*Plus环境切换到操作系统环境,以便执行操作系统命名。 c. host [command] 在sql*plus环境中执行操作系统命令,如:host notepad.exe..._sql+plus的使用方法
文章浏览阅读441次。该文档均来自互联网,如果侵犯了您的个人权益,请联系我们将立即删除!**学校毕 业 论 文**学校园网络服务器的配置与管理姓 名: **学 号: **指导老师:系 名:专 业: 计算机网络技术班 级:二0一一年十二月十五日摘 要随着网络技术的不断发展和Internet的日益普及,许多学校都建立了校园网络并投入使用,这无疑对加快信息处理,提高工作效..._服务器配置与应用论文
文章浏览阅读1k次。一、单实例多库:一个mysql实例,创建多个数据目录。规划:实例路径:/usr/local/mysql数据目录路径:(1)/usr/local/mysql/data(2)/usr/local/mysql/data2步骤:安装mysql。配置my.cnf文件。初始化各个数据库。用mysqld_multi启动。1、安装mysql。平常安装。2、m..._数据库单实例和多实例
文章浏览阅读6.3k次。今天装了第三方的MFC软件库Xtreme ToolkitPro v15.0.1,听说搞MFC的人都知道它的强大,我刚学习,所以装了一个,然后想运行一下它自带的例子看看。出现一个“找不到mfc90.dll“的问题,百度一下,记录如下:vs2008已经打过sp1补丁,编译C++程序会提示找不到mfc90.dll文件的错误,但是如果是release版的话就能正常运行csdn看到解决方案,粘贴_microsoft v90.debugmfc
文章浏览阅读2.1k次。以前使用CJK进行中文的排版,需要自己生成字体库,近日,出现了XeTeX,可以比较好的解决中文字体问题,不需要额外生成LaTeX字体库,直接使用计算机系统里的字体,本文以在Linux下为例说明XeTeX的使用。操作系统: UbuntuTeX:除了texlive包外,还需要安装的包是texlive-xetex。字体:可以使用fc-list查看你自己的字体库,注意字体的完整名称,在XeTe..._latex 中文排版 texlive