版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
扩展,比如电机、蓝牙、wifi以及各种传感器等。TOC\o"1-2"\h\z\u GPIO和LED实 LED、Key、Uart,Arduino1-1Colibri123SWD接口453671USB894sdio1ArduinoUNO3Cortex-M3324GB。ARM4GB的问这些外设的寄存器,从而控制外设的工作。M3器映射见图2-1所示: 地址范围,因为它的地址总线宽度是32位。此外,为了降低不同客户在相同应用时的软件复杂度,映射是按Cortex™-M3处理器提供的规则预先定义的。ARM®Cortex™-M3的自带的系统APB1外设都位于从0x40000000到0x4000FFFF的地址空间,而APB2外设都位于从0x40010000到0x40017FFF的地址区域。从0x40020000到0x4002FFFF的地址区域被AHB1设备所使用,从0x 到0x4800FFFF的地址区域被AHB2设备所使用。GD32F207系列器件的系统结构如下图所示。基于AMBA3.0AHB-LITE的多层总线互联矩阵将代码区域(为0x 和,以及调试。系统区域包括内部SRAM区域和外设区域。总线矩阵包含5个从机,AHB1AHBAHBAHBAPBAHB1APB总APBAPBAPB总线都能够按最高频率72MHz工作。 从角度来说,时钟源分为内部时钟与外部时钟源,内部时钟是在内部RC振荡般采用8MHz的晶振。(HSI32.768KHz。I40KHz。SYSCLK:系统时钟,GD32F207AHB预分频器分配HCLK:AHBAHB的时钟信号,提供给器,DMAcortexcortex内核运行的时钟,cpu主频就是这个信号,它的大小与GD32F207运算速度,数据存取速度密切相关。FCLKAHBHCLK,因此在HCLK时钟停止时FCLK也继续运行。它可以保证在处理器休眠时,也能够采样和到中断和休眠,它与HCLK互相同步。PCLK1APB136MHz,提供给挂载在APB1总线上的外设。PCLK2APB272MHz,提供给挂载在APB2总线上的外设。Cortex内核具有强大的异常响应系统,它把打断当前代码执行流程的分为异常的所有中断机制都由NVIC实现。GD32F207对这个表重新进行了编排,把编号从-36的中断向量定义为系统异常,编号为负的内核异常不能被设置优先级,如复位(Reset)、不可中断(NMI)、硬错误(Hardfault)7开始的为外部中断,这些中断的优先级都是可以自行设置的。详细的GD32F207中断向量表见下表。了解到代码是如何支持的。因为不同型号的GD32F207,中断向量表会稍微有区别。NVIC(NestedVectoredInterruptController)Cortex内核的器件,不可中断(NMI)和外部中断都由它来处理,而SYSTICK不是由NVIC来控制的。CortexM3的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编H001011L1H打断,由于L1L0L1L0L1L0中断是同时到达的,内核就会首先响应响应优先级别更高的L0中断。NVICSTNVIC_PriorityGroupConfig(),可用的参数为NVIC_PriorityGroup_0~NVIC_PriorityGroup_4,分别对应以上介绍的5种分配组。同厂商的CM3处理器间的移植工作。(FCLK(STCLK中,SysTick以HCLK(AHB时钟)或HCLK/8作为运行时钟。 存器STK_LOAD中的数据加载到STK_VAL,重新计数。General-PurposeInput/OutputPorts。GPIOA、GPIOB0~1516个不同的引脚,对于不同型号的,端口的组和引脚的数量不同。以PA0~PA15和PB0~PB15,PC0~GPIO端口和和其他的备用功能(AFs)复用同一管脚,在特定的封装下获得最大的的灵活性。每一个GPIO可以软件配置为输出(推挽或开漏),输入,外设备用功能或模拟模式。每一个GPIO管脚可以配置为上拉,下拉或无上拉/GPIOs都具备的提示系统状态。驱动LED十分简单,只需要通过GPIO的电压变化就可以。#include#include#if(EVB_EXAMPLE==/*用户应用程序 函数*/intmain(void){int/**/PRINTFLED#####\r\n");{for(i=0;i<0x7fffff;i++);for(i=0;i<0x7fffff;i++);}}void{GPIO_InitParaGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=void{GPIO_InitParaGPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_PIN_11|GPIO_InitStructure.GPIO_Mode=GPIO_MODE_OUT_PP;GPIO_InitStructure.GPIO_Pin=GPIO_PIN_11|}GPIOCGPIOD11\12\13的管脚为输出模式,翻转速率我们对这三个成员赋予不同的数值可以对GPIO端口进行不同的配置。voidEvbLedControl(intindex,int{switchvoidEvbLedControl(intindex,int{switch{case{if(cmd=={GPIO_SetBits(GPIOD,GPIO_PIN_11);}{GPIO_ResetBits(GPIOD,GPIO_PIN_11);}}case{if(cmd=={GPIO_SetBits(GPIOD,GPIO_PIN_12);}}{GPIO_ResetBits(GPIOD,GPIO_PIN_12);}}case{if(cmd=={GPIO_SetBits(GPIOD,GPIO_PIN_13);}{GPIO_ResetBits(GPIOD,GPIO_PIN_13);}}{if(cmd=={}}}}}#include#include#if(EVB_EXAMPLE==/*BOOT之后会调用main*/intmain(void){int/*BUZZER*/{for(i=0;i<0xffff;for(i=0;i<0xffff;i++);}}voidvoid{/*使能GPIOB时钟*//*PD1用于控制蜂鸣器*/GPIO_InitStructure.GPIO_Mode=GPIO_MODE_OUT_PP;}voidEVB_BuzzerControl(int{ifif{}{}}三个成员赋予不同的数值可以对GPIO端口进行不同的配置。以驱动蜂鸣器。电压的控制是通过库函数GPIO_SetBits()完成的;GD32F207EXTIExternalinterrupt)指的是外部中断。GD32F207的所有GPIOEXTIGPIO都能作为外部中断的输入源。GPIOEXTI的连接方式见EXTI15。PAx~PGx端口的中断都连接到了EXTIx,即同一时刻EXTx只能相应一个端口的触发,不能够同一时间响应所有GPIO端口的。它可以配置为上升沿触发,下降沿EXTI最普通的应用就是接上一个按键,设置为下降沿触发,用中断来检测按键。本实验通过外部按键来控制板载LED的点亮和熄灭。4-2#include#include#if(EVB_EXAMPLE==void{staticintindex=1;if(EvbKeyScan()){if(index%{EvbLedControl(LED1,LED_ON);EvbLedControl(LED2,LED_ON);}{EvbLedControl(LED1,LED_OFF);EvbLedControl(LED2,}}}}/*BOOT之后会调用main*/intmain(void){return}void{GPIO_InitParaGPIO_InitStructure;EXTI_InitParaEXTI_InitStructure;NVIC_InitParaNVIC_InitStructure;void{GPIO_InitParaGPIO_InitStructure;EXTI_InitParaEXTI_InitStructure;NVIC_InitParaNVIC_InitStructure;/*ConfigurePD14\15pinGPIO_InitStructure.GPIO_Pin=GPIO_PIN_14|GPIO_PIN_15;GPIO_InitStructure.GPIO_Mode=GPIO_MODE_IN_FLOATING;GPIO_Init(GPIOD,&GPIO_InitStructure);/*ConnectEXTILine14toPD14pin*//*ConnectEXTILine15toPD15pin*//*ConfigureEXTILine0anditsinterrupttothelowestpriority*/EXTI_InitStructure.EXTI_LINE=EXTI_LINE14|EXTI_LINE15;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LINEEnable=ENABLE;NVIC_InitStructure.NVIC_IRQ=EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQPreemptPriority=0;NVIC_InitStructure.NVIC_IRQSubPriority=1;NVIC_InitStructure.NVIC_IRQEnable=ENABLE;}int{//intvalue=0;intcount=0xffff;if(EXTI_GetIntBitState(EXTI_LINE14)!={if(EXTI_GetIntBitState(EXTI_LINE14)!={return1;}}if(EXTI_GetIntBitState(EXTI_LINE15)!={if(EXTI_GetIntBitState(EXTI_LINE15)!={return2;}}//returnvalue;return0;}使能EXTIx配置EXTIx配置EXTIEXTINVIC调用NVIC_PriorityGroupConfig()NVIC1组。接下来第4~15线的中断向量。Pin14、15设置为EXTI输入线。这里需要填写EXTI的初始化结构体。进入中断后,调用函数EVB_KeyScan()来检查是否有按键发生。库函数按键2就可以分别点亮或者熄灭LED1、LED2。4-3UART是常见的一种串行数据总线,用于异步通信。该总线支持双向通信,可以实现全符。通常采用ASCII码。从最低位开始传送,靠时钟采样定位。波特率寄存器USART_BRR用于配置UART的波特率。USART_BRR寄存器包括两部分,分别是DIV_Mantissa(整数部分)和DIVFraction(小数)部分,计算为USARTDIV=DIV_Mantissa+(DIVFraction/16)USARTDIV即是用来对串口时钟源进行分频的参数。串口的时钟源经过USARTDIV分频后作为发送和接收的时钟。RAMUARTTDR,控制Rx一位一位地输入到接收移位寄输出。根据输入的数据(数字1~4)来控制板载LED的点亮和熄灭。GD32F207有两个USART,其中USART1通过USB转串口CH340在地板引出,intmain(void){charc;inti;/*/**//*配置使能评估板上的UART设备*/PRINTFUSART1#####\r\n");PRINTF("INPUT4CHARsFirst.\r\n");{for(i=0;i<0xffffff;i++); o,colibri\r\n");}return}usart1115200、8个数据位、1个停止位、无硬件流控制。即1152008-N-1。voidvoid{/*ConfiguretheGPIOports*/GPIO_InitParaGPIO_InitStructure;USART_InitParaUSART_InitStructure;/*EnableGPIOAclock/*EnableUSART1APBclock*//*EnableUSART1APBclock*/RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF,ENABLE); =GPIO_PIN_6; =GPIO_MODE_AF_PP; =GPIO_SPEED_50MHZ;GPIO_Init(GPIOB,&GPIO_InitStructure); =GPIO_PIN_7; =GPIO_MODE_IN_FLOATING;;GPIO_Init(GPIOB,//USART_DeInit(USART1);====USART_InitStructure.USART_HardwareFlowControl= =USART_RXORTX_RX|ColibriUSB1152008-N-1,将编同厂商的CM3处理器间的移植工作(FCLK(STCLK中,SysTickHCLK(AHB时钟)HCLK/8作为运行时钟。见图61。存器STK_LOAD中的数据加载到STK_VAL,重新计数。 ET 能,控制LED以1秒的频率闪烁。void{staticintvoid{staticintTimingDelayLocal=0;if(TimingDelayLocal=={TimingDelayLocal=0;}}staticvoid{//if(SysTick_Config(SystemCoreClock/{while}}}int{PRINTF(SYSTICK#####\r\n");}SysTick_Config()函数时,向它输入的参数为:SystemCoreClock/1000。因为断服务函数SysTick_Handler()。void{staticintTimingDelayLocal=0;if(TimingDelayLocal=={void{staticintTimingDelayLocal=0;if(TimingDelayLocal=={TimingDelayLocal=0;}}}将编译好的程序到开发板,即可看到串口工具打印出如图12-4的信息。手动输入任意字符后,板载LED开始不停的闪烁。中有一段启动代码,见代码10-1。Reset_Handler;输出子程序Reset_HandlerEXPORT;从外部文件中引入mainIMPORTIMPORT R0,R0,=main,最后转到用户文件中的“main”函数,开始运行用户程序。SystemInit() staticstaticvoid{#elifdefinedSYSCLK_FREQ_48MHz_HSI#elifdefinedSYSCLK_FREQ_72MHz_HSI}//#define//#define//#define//#define//#define//#define TrochiliRTOS的文件结构是很清晰的,并且各个文件很独立。在上面介绍的内核文TrochiliRTOS*Copyright(C)2015**#ifndef_TCL_CFG_H#define/*内核时钟节拍配置,硬件定时器每秒中断次数*/#defineTCL_TIME_TICK_RATE /*{0,1,2,30,31}共5个优先级保留给内核用,用/*#define/*#define(TCL_PRIORITY_NUM-/*用户线程优先级范围配置*/#defineTCL_USER_PRIORITY_LOW/*内核断言功能配置#define/*#defineTCL_THREAD_STACK_CHECK_ENABLE#defineTCL_THREAD_STACK_ALARM_RATIO /*n%,栈使用量 /*IPC#define #define #define #define #define #define #define /*#define #defineTCL_TIMER_DAEMON_ENABLE #defineTCL_TIMER_WHEEL_SIZE /*中断管理配置#define /*#define /* #defineTCL_IRQ_DAEMON_ENABLE /*使能异步中断处理 /*动态内存管理配置#define #defineTCL_MEMORY_POOL_ENABLE #defineTCL_MEMORY_POOL_PAGES #defineTCL_MEMORY_BUDDY_ENABLE #defineTCL_MEMORY_BUDDY_PAGES /*#define #define /*#defineTCL_IRQ_DAEMON_PRIORITY #defineTCL_IRQ_DAEMON_SLICE #defineTCL_IRQ_DAEMON_STACK_BYTES /*/*内核定时器守护线程优先级、时间片和栈大小*/#defineTCL_TIMER_DAEMON_PRIORITY #defineTCL_TIMER_DAEMON_SLICE #define /*IDLE#defineTCL_IDLE_DAEMON_PRIORITY #defineTCL_IDLE_DAEMON_SLICE #define /*内核网络服务线程优先级、时间片和栈大小*/#defineTCL_NET_SERVICE_PRIORITY #define #defineTCL_NET_SERVICE_STACK_BYTES/*#defineTCL_CPU_IRQ_NUM#defineTCL_CPU_CLOCK_FREQ#endif/*_TCL_CFG_Htcl.gd32f207.a.asmtcl.gd32f207.c就是我们在GD32处理器上移植内核的具体实 *(--pTemp)=;/**(--pTemp)=;/**(--pTemp)=;/**(--pTemp)=*(--pTemp)=;/*/*R0,*(--pTemp)=;/**(--pTemp)=;/**(--pTemp)=/**(--pTemp)=;/**pTop=}CpuConfirmThreadSwitch()来码虽然很短,但涉及的技术细节很多。PendSV中断处理函数实现和注解如下:序状态寄存器)PC(R15). ; R0,=uKernelVariable R1,R0,#4;Nominee R0,R0,#8;Current; R2, R3,[R1] R2,R3 ; R3,[R2,#0] R3,R3,#0x1 R3, R3,PSP R3,R3, R3,{R4-R11r4-r11uThreadCurrent R3,[R2,#4];pspuThreadCurrent ;使得uThreadCurrent=uThreadNominee; R3,[R1] R3, R3,[R3,#4] ;根据uThreadCurrent中取得SP数值到R0 R3,{R4-R11};从新线程栈出r4-11 R3,R30x20psp PSP,
;上电后,处理器处于线程+模式+msp LR,LR, ;(;(;( ;返回后,处理器使用线程 有可能,所以之前的PendSV请求可能又不需要了。PendSV中断。一旦PendSV中断执行,它会关闭中断,此时线程调度才真正执行。0PendSV次发出PendSV中断请求,也有可能会取消线程调度。函数uCpuCalcHiPRIO()通过RBITCLZSystickSystickGD32F10x处理器上是按照72M处理器频率和每10毫秒一次定时器中断来设置的。voidvoid {TReg32/* =pUserEntry; =pCpuEntry;uKernelVariable.BoardSetupEntry=pBoardEntry; =pTraceEntry; =/**/#if#if/*/*/*/*#if((TCL_TIMER_ENABLE)&& /*#if((TCL_TIMER_ENABLE)&& /*#if((TCL_IRQ_ENABLE)&& /*/*/*IDLEwhile{uDebugPanic("",FILE,FUNCTION,LINE}}#include#include#include#if(EVB_EXAMPLE==/*用户线程参数#defineTHREAD_LED_PRIORITY#defineTHREAD_LED_SLICE/*staticTWord/*用户线程定义staticTThread/*用户定时器结构*/staticTTimerLedTimer;/**/staticdelay(TWordcount){}staticvoidBlink(TArgumentdata){staticintindex=if(index%{}{}
}/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 抱团出游安全协议书
- 天津市北辰区第三学区2024-2025学年八年级上学期11月期中数学试卷(含答案)
- 山东省枣庄市台儿庄区2024-2025学年九年级上学期期中考试物理试题
- 辽宁省鞍山市海城市西部集团2024-2025学年七年级上学期11月期中英语试题(含答案)
- 河南省焦作市中站区2024-2025学年七年级上学期期中生物学试题(含答案)
- 《双组分纺粘法非织造布》
- 安徽省安庆市外国语学校2024-2025学年九年级上学期11月期中考试化学试题(含答案)
- 离子风枪行业相关投资计划提议
- 蓝耳病初期的症状
- 高分子合成材料行业相关投资计划提议
- 中国高级经理人心理状况调查报告
- 安全风险分级管控和隐患排查治理情况总结
- 2023年江苏省单招高考数学试卷和答案
- 纺织品检验与贸易专业(群方向)人才培养方案
- 船舶能效管理计划
- 外研版英语五年级上册一起点测试卷及答案
- 2023学年完整公开课版九年级Unit5TheDifficultSearchforAmerican
- 中医学与循证医学
- 《中国民间故事》知识答题参考题库(含答案)
- Pilz安全继电器说明书大全-1
- 文莱专题知识课件
评论
0/150
提交评论