longan nano与stm32f103c8t6的区别
时间: 2023-09-30 18:05:11 浏览: 156
Longan Nano是一个基于GD32VF103CBT6处理器的开发板,而STM32F103C8T6则是一个基于STM32F103C8T6处理器的开发板。它们之间的主要区别在于处理器型号和架构,以及所使用的开发工具和库的不同。
Longan Nano使用RISC-V处理器架构,而STM32F103C8T6使用ARM Cortex-M3架构。这意味着它们的指令集和寄存器组不同,因此需要不同的编程技巧和工具。Longan Nano通常使用开源的工具链和库,如GCC编译器和FreeRTOS操作系统,而STM32F103C8T6则通常使用STMicroelectronics提供的工具和库,如Keil MDK和ST HAL库。
另外,Longan Nano还有一些额外的硬件模块,如OLED屏幕和红外接收器,这些模块可以方便开发人员进行快速原型设计和测试。而STM32F103C8T6通常需要外接更多的硬件模块来实现相同的功能。
总之,Longan Nano和STM32F103C8T6都是功能强大的开发板,它们适用于不同的应用场景和开发需求。开发人员可以根据自己的具体需求选择其中一种开发板。
相关问题
NANO\stm32f103c8t6点亮led灯
### 使用STM32F103C8T6单片机点亮LED灯
#### GPIO配置与初始化
为了使STM32F103C8T6能够控制外部设备如LED,需要先设置相应的GPIO引脚为输出模式。这涉及到几个重要的寄存器操作:
- **GPIOx_CRL/CRH (Control Register Low/High)**:用于配置每个引脚的工作模式。
- **GPIOx_ODR (Output Data Register)**:用来写入要输出的数据。
对于低八位的引脚配置通过`GPIOx_CRL`完成;高八位则由`GPIOx_CRH`负责[^1]。
#### 初始化函数实现
下面是一个简单的初始化函数示例,它会把PA5配置成推挽输出模式以便驱动连接在其上的LED:
```c
#include "stm32f1xx.h"
void GPIO_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
/* 配置 PA5 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 设置管脚编号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 输出速度设定为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 应用上述配置到GPIOA上
}
```
#### 控制LED状态切换
一旦完成了硬件接口的初始化工作之后就可以很方便地改变指定引脚的状态从而达到开关LED的效果了。这里给出一段可以周期性翻转PA5电平的小程序片段作为例子展示如何让LED闪烁起来:
```c
int main(void){
GPIO_Init(); // 调用前面定义好的初始化过程
while(1){ // 主循环体
GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET); // 将PA5设为高电平(即打开LED)
Delay_ms(500); // 延迟一段时间
GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET); // 关闭LED
Delay_ms(500);
}
}
// 简易延时函数模拟等待时间
void Delay_ms(uint32_t nTime){
uint32_t i,j;
for(i=nTime;i>0;i--)
for(j=SysTick->LOAD;j>0;j--);
}
```
这段代码实现了最基本的LED闪动效果,在实际应用中可以根据需求调整延迟时间和频率等参数[^2]。
gd32f103c8t6 gcc startup
以下是使用 GCC 编译器在 GD32F103C8T6 上启动的基本步骤:
1. 编写 startup 文件
创建一个名为 startup_gd32f10x.s 的文件,其中包含以下内容:
```
/* 启动代码 */
.section .isr_vector
.word _estack /* 堆栈顶指针 */
.word Reset_Handler /* 复位中断处理函数 */
.word NMI_Handler /* NMI中断处理函数 */
.word HardFault_Handler /* 硬件故障中断处理函数 */
.word MemManage_Handler /* 内存管理中断处理函数 */
.word BusFault_Handler /* 总线故障中断处理函数 */
.word UsageFault_Handler /* 用法故障中断处理函数 */
.word 0 /* 保留 */
.word 0 /* 保留 */
.word 0 /* 保留 */
.word 0 /* 保留 */
.word SVC_Handler /* SVC中断处理函数 */
.word DebugMon_Handler /* Debug Monitor中断处理函数 */
.word 0 /* 保留 */
.word PendSV_Handler /* PendSV中断处理函数 */
.word SysTick_Handler /* SysTick中断处理函数 */
/* 复位中断处理函数 */
Reset_Handler:
ldr sp, =_estack /* 初始化堆栈指针 */
bl SystemInit /* 系统初始化 */
bl main /* 跳转到主函数 */
/* 中断处理函数 */
NMI_Handler:
b .
HardFault_Handler:
b .
MemManage_Handler:
b .
BusFault_Handler:
b .
UsageFault_Handler:
b .
SVC_Handler:
b .
DebugMon_Handler:
b .
PendSV_Handler:
b .
SysTick_Handler:
b .
```
2. 编译 startup 文件
使用以下命令将 startup_gd32f10x.s 文件编译为 startup_gd32f10x.o 文件:
```
arm-none-eabi-as -mthumb -o startup_gd32f10x.o startup_gd32f10x.s
```
3. 编写链接文件
创建一个名为 gd32f103c8t6.ld 的文件,其中包含以下内容:
```
/* 定义内存区域 */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
}
/* 定义符号 */
SECTIONS
{
.text :
{
KEEP(*(.isr_vector))
*(.text)
} >FLASH
.rodata :
{
*(.rodata)
} >FLASH
.data :
{
*(.data)
} >SRAM AT >FLASH
.bss :
{
*(.bss)
} >SRAM
/* 定义栈顶指针 */
_estack = ORIGIN(SRAM) + LENGTH(SRAM);
}
```
4. 编译应用程序文件
编写应用程序的 C/C++ 文件,并将其编译为 .o 文件。
5. 链接所有文件
使用以下命令将所有 .o 文件链接在一起:
```
arm-none-eabi-gcc -mthumb -specs=nano.specs -specs=nosys.specs -T gd32f103c8t6.ld startup_gd32f10x.o main.o -o main.elf
```
6. 生成二进制文件
使用以下命令将 .elf 文件转换为 .bin 文件:
```
arm-none-eabi-objcopy -O binary main.elf main.bin
```
7. 烧录二进制文件
将生成的 main.bin 文件烧录到 GD32F103C8T6 上,即完成启动。
阅读全文