bigbat

  • 2021-01-25
  • 发表了主题帖: 【RISC-V MCU CH32V103测评】使用USART2

    实际工作中往往需要使用多个串口。这颗芯片的模板例程只是用了一个串口用做debug。需要准备一个TTL转RS232接头,因为引脚是TTL电平 现在测试一下使用第二个串口USART2。首先参考了资料USART_Polling例程。为啥使用这个例程因为简单!结合手册《CH32xRM(应用手册).PDF》对串口的描述。分析例程后将程序简化了一下。 /******************************************************************************* * Function Name : USARTx_CFG * Description : Initializes the USART2 & USART3 peripheral. * Input : None * Return : None *******************************************************************************/ void USARTx_CFG(void) { GPIO_InitTypeDef GPIO_InitStructure; //GPIO初始化结构 USART_InitTypeDef USART_InitStructure;//串口控制器初始化结构 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_USART3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB , ENABLE); /* USART2 TX-->A.2 RX-->A.3 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化usart2引脚 USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure);//初始化串口 USART_Cmd(USART2, ENABLE);//打开串口 } 编程步骤: 一、设置串口控制器时钟源为启动状态 二、初始化GPIO引脚为USART引脚,TX--->PA2, RX--->PA3 三、设置串口参数、115200,8,N,1;双工模式 四、打开串口 好了,这样就可以使用串口了。发送数据使用函数USART_SendData() 只可惜每次只能一个字符的发送,我自己写了个USART_SendBuf函数 /******************************************************************************* * Function Name : USART_SendBuf * Description : Transmits single data through the USARTx peripheral. * Input : USARTx: where x can be 1, 2, 3 to select the USART peripheral. * Data: the data to transmit.. * TxSize:the data of size. * Return : None *******************************************************************************/ void USART_SendBuf(USART_TypeDef* USARTx, u8 *Data,uint16_t TxSize) { uint16_t TxCnt = 0; while(TxCnt < TxSize ) { USART_SendData(USART2, Data[TxCnt++]); while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) { /* waiting for sending finish */ } } } 可以看到串口已经可以收到数据了。  

  • 2021-01-24
  • 回复了主题帖: 升级一下嵌入式RISC-V编译器

    void NMI_Handler(void) __attribute__((interrupt("machine"))); void HardFault_Handler(void) __attribute__((interrupt("machine"))); void EXTI0_IRQHandler(void) __attribute__((interrupt("machine"))); //void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); //void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); //void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); 现在通过修改程序目前测试已经可以啦。没有出现任何问题  

  • 回复了主题帖: 升级嵌入式RISC-V编译器

    其实中断代码一点也不神秘,startup_ch32v10x.s代码中的各种中断函数声明。 /********************************** (C) COPYRIGHT ******************************* * File Name : startup_ch32v10x.s * Author : WCH * Version : V1.0.0 * Date : 2020/04/30 * Description : CH32V10x vector table for eclipse toolchain. *******************************************************************************/ .section .init,"ax",@progbits .global _start .align 1 _start: j handle_reset .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00000013 .word 0x00100073 .section .vector,"ax",@progbits .align 1 _vector_base: .option norvc; j _start .word 0 j NMI_Handler /* NMI Handler */ j HardFault_Handler /* Hard Fault Handler */ .word 0 .word 0 : : : .word 0 .word 0 j SysTick_Handler /* SysTick Handler */ .word 0 j SW_handler /* SW Handler */ .word 0 /* External Interrupts */ j WWDG_IRQHandler /* Window Watchdog */ j PVD_IRQHandler /* PVD through EXTI Line detect */ j TAMPER_IRQHandler /* TAMPER */ j RTC_IRQHandler /* RTC */ j FLASH_IRQHandler /* Flash */ j RCC_IRQHandler /* RCC */ j EXTI0_IRQHandler /* EXTI Line 0 */ j EXTI1_IRQHandler /* EXTI Line 1 */ j EXTI2_IRQHandler /* EXTI Line 2 */ j EXTI3_IRQHandler /* EXTI Line 3 */ j EXTI4_IRQHandler /* EXTI Line 4 */ j DMA1_Channel1_IRQHandler /* DMA1 Channel 1 */ j DMA1_Channel2_IRQHandler /* DMA1 Channel 2 */ j DMA1_Channel3_IRQHandler /* DMA1 Channel 3 */ j DMA1_Channel4_IRQHandler /* DMA1 Channel 4 */ j DMA1_Channel5_IRQHandler /* DMA1 Channel 5 */ j DMA1_Channel6_IRQHandler /* DMA1 Channel 6 */ j DMA1_Channel7_IRQHandler /* DMA1 Channel 7 */ j ADC1_2_IRQHandler /* ADC1_2 */ .word 0 .word 0 .word 0 .word 0 j EXTI9_5_IRQHandler /* EXTI Line 9..5 */ j TIM1_BRK_IRQHandler /* TIM1 Break */ j TIM1_UP_IRQHandler /* TIM1 Update */ j TIM1_TRG_COM_IRQHandler /* TIM1 Trigger and Commutation */ j TIM1_CC_IRQHandler /* TIM1 Capture Compare */ j TIM2_IRQHandler /* TIM2 */ j TIM3_IRQHandler /* TIM3 */ j TIM4_IRQHandler /* TIM4 */ j I2C1_EV_IRQHandler /* I2C1 Event */ j I2C1_ER_IRQHandler /* I2C1 Error */ j I2C2_EV_IRQHandler /* I2C2 Event */ j I2C2_ER_IRQHandler /* I2C2 Error */ j SPI1_IRQHandler /* SPI1 */ j SPI2_IRQHandler /* SPI2 */ j USART1_IRQHandler /* USART1 */ j USART2_IRQHandler /* USART2 */ j USART3_IRQHandler /* USART3 */ j EXTI15_10_IRQHandler /* EXTI Line 15..10 */ j RTCAlarm_IRQHandler /* RTC Alarm through EXTI Line */ j USBWakeUp_IRQHandler /* USB Wakeup from suspend */ j USBHD_IRQHandler /* USBHD */ .option rvc; .section .text.vector_handler, "ax", @progbits .weak NMI_Handler : : : .section .text.handle_reset,"ax",@progbits .weak handle_reset .align 1 handle_reset: .option push .option norelax la gp, __global_pointer$ .option pop 1: la sp, _eusrstack 2: /* Load data section from flash to RAM */ la a0, _data_lma la a1, _data_vma la a2, _edata bgeu a1, a2, 2f 1: lw t0, (a0) sw t0, (a1) addi a0, a0, 4 addi a1, a1, 4 bltu a1, a2, 1b 2: /* clear bss section */ la a0, _sbss la a1, _ebss bgeu a0, a1, 2f 1: sw zero, (a0) addi a0, a0, 4 bltu a0, a1, 1b 2: /* enable all interrupt */ li t0, 0x88 csrs mstatus, t0 la t0, _vector_base ori t0, t0, 1 csrw mtvec, t0 jal SystemInit la t0, main csrw mepc, t0 mret 不难发现这些中断函数就是预先声明好的例程。当程序中有同名的程序就用该程序覆盖。所以中断函数都是不能改名的。有什么中断函数就到startup_ch32v10x.s中查找就可以了。 下一步,测试将整个ide环境迁移到vscode中。eclipse的环境我的电脑上有点卡。  

  • 发表了主题帖: 升级嵌入式RISC-V编译器

    ch32v103c8t6的板子使用的是MounRiver Studio工具开发,这个工具的集成度还是不错的,但是里面的项目模板有点“简单”。看来要详细研究芯片的工作原理有点懵逼。所以就花了些时间来研究,发现该工具集成的是xpack出品的gnu risc-v工具和调试器OpenOCD。下载了xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip这个最新版本的工具。辛辛苦苦的一番配置,结果很是悲剧:MounRiver的IDE无法下载程序了,于是只好卸了重装吧,经过几番折腾的成果就是了解到MounRiver的工具的makefile文件在哪里了。 看到了吧就是这里啦,就是每个项目的obj目录。 赶忙将下载的文件xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip解压,把文件的主目录命名为F:\RVGCC。openocd的目录也考到这个目录下l,make工具也是拷贝到这个目录。下面的操作都是基于这个目录的。 首先,设置目录路径 set PATH=%PATH%;F:\RVGCC\bin;F:\RVGCC\BTools\bin;F:\RVGCC\OpenOCD\bin 使用测试一下环境是否正确。 riscv-none-embed-gcc --vserion 二、找到项目目录路径 cd F:\MounRiver\MounRiver_Studio\workspace\gcctest\obj 三、编译  make clean make -j8 all 先清除一下,项目在编译。 编译时出现了警告,我没有理会。有点草率了,将程序烧写到芯片后,能够正常运行。这时我就误认为升级成功了,还发了一篇帖子“炫耀一下”。结果被打脸啦啦! 后来,我就进行了外部中断的实验,结果这个编译器编译的程序就出问题啦。程序看着一切正常,但是只能中断一次。马上去帖子里说明道歉。 后来我有点不服气,尤其是看到 void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); 啥意思:“interrupt("WCH-Interrupt-fast")难道还是特制的编译器吗!”。按道理说不可能吧!是不是在”装神弄鬼“这个就不知道了。 随后,通过反汇编对比  //新版编译汇编程序 2e: 40b2 lw ra,12(sp) 30: 0141 addi sp,sp,16 32: 8082 ret //专用版编译汇编程序 1c: 4505 li a0,1 1e: 00000097 auipc ra,0x0 22: 000080e7 jalr ra # 1e <.LVL1+0x2> 00000026 <.L4>: } } 26: 30200073 mret 果然是中断的返回指令有问题,新版的指令是ret,专版是mret  这下明白了,原来是新版的程序不认识“interrupt("WCH-Interrupt-fast")这个属性造成的。后来找到了GUN的说明。 https://gcc.gnu.org/onlinedocs/gcc/RISC-V-Function-Attributes.html#RISC-V-Function-Attributes 这个说明中明确了该属性: Permissible values for this parameter are user, supervisor, and machine. If there is no parameter, then it defaults to machine. void NMI_Handler(void) __attribute__((interrupt("machine"))); void HardFault_Handler(void) __attribute__((interrupt("machine"))); void EXTI0_IRQHandler(void) __attribute__((interrupt("machine"))); 然后编译测试,呵呵反正是一切正常。后来又测试其它程序也正常。 那为什么不是user或supervisor呢?应该user, supervisor是用在具有MMU的机器里的吧。接着就进行了测试,果然不行而且中断后马上死机。 虽然升级成功但是心里真的很别扭。为什么国内的公司非要装神弄鬼的呢?而且这个芯片的资料很是粗糙,开发手册是用与ARM的体系合起来的。难道就不能彻底的测试一下写个完整的文档吗?说实话我真没有勇气把产品直接改到国产芯片上来的。如果出问题了可能老板家就彻底翻不了身了。  

  • 回复了主题帖: 升级一下嵌入式RISC-V编译器

    经过反汇编对比发现不能编译的原因! 机器自带的编译编译的中断程序返回汇编指令是    26:    30200073     mret 而新版的编译器因为无法识别void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));中的属性汇编指令是 32:    8082                    ret 所以造成中断无法返回!

  • 2021-01-23
  • 回复了主题帖: 【RISC-V MCU CH32V103测评】使用EXIT中断

    本帖最后由 bigbat 于 2021-1-23 17:32 编辑 目前的测试还算正常。    

  • 发表了主题帖: 【RISC-V MCU CH32V103测评】使用EXIT中断

    RISC-V MCU CH32V103,外部中断测试。 如果想使用外部中断必须要进行必要的设置。如何设置呢?这是个很头疼的问题,因为手册里没有详细的说明,那没设么好办法只好分析例程啦。手册上只说 “芯片的外部中断/事件控制器(EXTI) 有20 个边沿检测器,用于产生中断/事件请求。每个中断线都可以独立地 配置其触发事件(上升沿或下降沿或双边沿),并能够单独地被屏蔽;挂起寄存器维持所有中断请求状 态。EXTI 可以检测到脉冲宽度小于内部 APB2 的时钟周期。多达 51 个通用 I/O 口都可选择连接到 16 个 外部中断线。” 那我的理解就是说有20个事件源,51个通用GPIO可以链接到这些中断源啦。 void EXTI0_INT_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); /* GPIOA ----> EXTI_Line0 */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStructure.EXTI_Line=EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 首先定义三个结构, GPIO_InitTypeDef GPIO_InitStructure;//GPIO数据结构 EXTI_InitTypeDef EXTI_InitStructure;//外部事件中断结构 NVIC_InitTypeDef NVIC_InitStructure;//中断管理器结构 本实验初始化步骤 1、GPIO定义为输入模式 2、EXIT管理器的EXTI_Line0号中断探测器定义为下降沿触发,并打开该功能,且允许中断。将EXTI_Line0和GPIO_PinSource0链接。     不着急,到这里还不能中断呢!这只是把线和中断探测器链接上(这里比较模糊的是GPIO_PinSource0这个参数,这是具体的一根引脚吗?) 3、初始化中断优先级管理器NVIC,将中断源EXTI0_IRQn启动,主优先级设置为1,次优先级为2。   好了这就可以启动中断了。接下来就是编写中断服务程序了 4、中断服务程序。这个需要在ch32v10x_it.c这个文件中编写,虽然不是必须在此,但是这里比较好管理。 void EXTI0_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); /******************************************************************************* * Function Name : EXTI0_IRQHandler * Description : This function handles EXTI0 Handler. * Input : None * Return : None *******************************************************************************/ void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!=RESET) { printf("Run at EXTI\r\n"); EXTI_ClearITPendingBit(EXTI_Line0); /* Clear Flag */ } } 注意EXTI0_IRQHandler这个名字不要随便该,因为链接程序会找不到了。 到此中断就算完成了。 只要在main函数中调用一下初始化程序就可以中断了。

  • 回复了主题帖: 升级一下嵌入式RISC-V编译器

    最新测试这个版本不能使用!经测试在使用中断的时候不正常,程序进入中断后,只执行一次,下次就无法中断了,目前不知道是什么原因造成的

  • 回复了主题帖: 升级一下嵌入式RISC-V编译器

    最新测试这个版本不能使用!经测试在使用中断的时候不正常,程序进入中断后,只执行一次,下次就无法中断了,目前不知道是什么原因造成的

  • 回复了主题帖: 升级一下嵌入式RISC-V编译器

    基于eclipse的工具链我是很讨厌的。有两个毛病真是受不了! 一、启动比较慢,又吃内存。 二、工程文件都堆在屏幕上看着很是闹心。 当然ide本身的语法提示也比较若,但是能使而已。 我是打算换成vscode的!后面测试顺利的化就是试试弄一下了。

  • 发表了主题帖: 升级一下嵌入式RISC-V编译器

    ch32v103c8t6的板子使用的是MounRiver Studio工具开发,这个工具的集成度还是不错的,但是里面的项目模板有点通过“简单”了。看来要详细研究芯片的工作原理有点懵逼。所以就花了些时间来研究一下,发现该工具集成的是xpack出品的gnu risc-v工具和OpenOCD。我就花了好长的时间下载了xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip这个最新版本的工具。辛辛苦苦的一番配置,结果很是悲剧MounRiver的IDE无法下载程序了,于是只好卸了重装吧,经过几番折腾的成果就是了解到MounRiver的工具的makefile文件在哪里了。 看到了吧就是这里啦。 赶忙把下载的文件xpack-riscv-none-embed-gcc-10.1.0-1.1-win32-x64.zip重新解压,我把文件的主目录命名为F:\RVGCC后面的操作都是这个目录 openocd的目录也考到这个目录下,make工具也是这个目录 好了,这下就可以编译了。 首先,设置目录路径 set PATH=%PATH%;F:\RVGCC\bin;F:\RVGCC\BTools\bin;F:\RVGCC\OpenOCD\bin 二、找到项目目录路径 cd F:\MounRiver\MounRiver_Studio\workspace\CH32V103C8T6 三、编译 make clean make -j8 all 先清楚一下原来工具生成的文件。再编译 出现了警告,不用理它。因为不符合c的标准才出现的 找到CH32V103C8T6.hex烧写到开发板测试 谢谢!各位一切正常,已经看到闪烁的led和printf的信息了。可能这次的实验是成功的吧,当然出现的警告需要测试看看对程序有没有上面影响。在给各位一个严肃的结论。这几天访问国外的站实在是慢。很是煎熬。所以后面的实验还是需要莫大的勇气的。

  • 2021-01-22
  • 回复了主题帖: linux开发板的问题

    推荐“韦东山”的板子,因为韦东山的教程最清楚。其它的教程收费的培训班可能好点,但是公开的教程都不是很系统

  • 发表了主题帖: 【RISC-V MCU CH32V103测评】点亮第二个LED

    基于CH32V103EVT的GOIP的实验,了解CH32V103这颗芯片的外设使用的是与ARM公司的总线结构AHB总线+APB总线。我猜想外设的编程也应该非常的相似。接下来我就想怎么使用PB1把LED点亮。找来杜邦线把PB1和LED相连接。然后开始了实验。 /* Global Variable */ /******************************************************************************* * Function Name : GPIO_Toggle_INIT * Description : Initializes GPIOA.0 * Input : None * Return : None *******************************************************************************/ void GPIO_Toggle_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开GPIOB的时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //设置GPIO的参数 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置强输出上拉模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置时钟速率 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB端口 } 在实验中, 1、首先要把GPIOB的时钟打开 2、使用结构体:GPIO_InitStructure设置具体的引脚。 3、初始化GPIOB端口。 int main(void) { u8 i=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf("This is printf example\r\n"); GPIO_Toggle_INIT(); while(1) { Delay_Ms(250); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET)); GPIO_WriteBit(GPIOB, GPIO_Pin_1, i); } } 然后写GPIO引脚,GPIO_WriteBit(GPIOB, GPIO_Pin_1, i); 程序下载后可以看到LED亮了起来。 总体感觉: 这颗芯片的编程和STM32非常的象。学过STM32的朋友应该不会感到有多陌生。  

  • 2021-01-21
  • 发表了主题帖: 【RISC-V MCU CH32V103测评】CH32V103C8T6芯片初印象

    拿到EEWORLD寄过来的RISC-V内核的开发板之后,我先做了一个点亮LED的实验,基本上比较顺利,能够看到LED正常的闪亮。说明芯片的引脚驱动能力还算不错。江苏沁恒公司在国内接口芯片市场是做的比较好的一家公司。我想整颗芯片应该是没有问题的吧。因为没有全面的测试所以不敢下结论:整个芯片的所有引脚都正常。但就这个实验来说是没有问题的。 从上面的图可以看出这颗芯片的总线和ARM的结构使用的是相同的结构,那就是说RISC的外设编程也应该是差不多的。继续探索可以发现系统的时钟树也是相似的。 从图中可以看出来系统的主时钟HSI和实时RTC时钟是分开的。系统中有内部 8MHz 的 RC 振荡器作为默认的 CPU 时 钟。系统时钟源 HSI 默认开启,在没有配置时钟或者复位后,内部 8MHz 的 RC 振荡器作为默认的 CPU 时钟,随后可以另外选择外部 4~16MHz 时钟或 PLL 时钟。当打开时钟安全模式后,如果 HSE 用作系统时 钟,此时检测到外部时钟失效,系统时钟将自动切换到内部 RC 振荡器,同时 HSE 和 PLL 自动关闭;对于关闭时钟的低功耗模式,唤醒后系统也将自动地切换到内部的 RC 振荡器。如果使能了 时钟中断,软件可以接收到相应的中断。从上文的描述可以看出:系统在启动时是能够配置是否可以使用外部时钟源的。这个设计和ARM的设计是一样的。 所以在编程时,可以通过配置PLL参数来给总线时钟设定工作频率。由此可以猜测系统初始化的过程: 1、设置是否使用外部时钟源HSI 2、根据时钟源的频率,设定PLL的系数。也就设定了总线的工作频率,当你搞定时钟设置后,就可以设置外设了。 3、根据PLL的参数可以计算出总线的工作率,从而设置定时器、USB、UART、SPI、I2C、PWM、ADC、DAC等外设的工作频率。 4、设置各种外设的其它工作参数就可以了。 5、设置外设的引脚和工作状态。 但是当我打开程序模板时发现是这样的。 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf("This is printf example\r\n"); while(1) { } } 啊代码这么少,惊讶!哦这么简单看来我是多虑啦。          

  • 回复了主题帖: 【RISC-V MCU CH32V103测评】开发环境安装及下载流程

    jinglixixi 发表于 2021-1-20 23:22 这是这次测评的开发板吗?与介绍的图片不太一样呀!
    是的,不一样缩水很多。

  • 发表了主题帖: 【RISC-V MCU CH32V103测评】初体验点亮LED

    板子拿到以后发现和图片不一样,板子很小,好象是MIN版的。只带了一块调试板。板子有没有带任何的线缆,所以需要一些其它的器材。USB-TypeC接头线一条,一个P5X2的电缆,因为调试板接头是USB接头,需要一条延长线(我用USB-HUB代替)。实验的步骤如下:友情提示先看板子的PDF文档! 一、下载:MounRiver Studio软件,需要注意的是这个软件是需要java环境的。java一定要装好,我这里是java 8的环境。安装很简单,一路的“NEXT”。建议安装在磁盘空间比较大的磁盘。我安装到F盘。 我安装好以后是这样子地。 二、连接调试器到主机,确认驱动正常。这个调试器可以虚拟出一个UART端口,所以暂时不需要串口电缆。 三、使用USB-TypeC电缆连接开发板,将电源开关拨到ON的位置,可以发现电源LED点亮。 四、将调式器的P2X5电缆连接到开发板。这个注意该开发板可以由调试器供电。USB-TypeC电缆可以不用连接。 五、下载样例程序,CH32V103EVT.zip解压就可以, 六、建立一个新工程,在建立工程时选择芯片的型号"CH32V103C8T6"   项目自动建立一个模板,我直接编译,该模板。使用flash菜单,下载程序到芯片(注意:这里一定要连接好调式器!) 我的打开串口助手设置为:115200,8,N,1 可以看到输出: 说明串口通讯正常。 七、点亮LED 首先注意板子的LED线没有连接到任何的PIN上,需要将线连接到PA0端口 看到了吧!线没有接,我找了一条线把PA0和LED1接上。将程序拷贝到我的项目。 /********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : WCH * Version : V1.0.0 * Date : 2020/04/30 * Description : Main program body. *******************************************************************************/ /* *@Note GPIO例程: PA0推挽输出。 */ #include "debug.h" /* Global define */ /* Global Variable */ /******************************************************************************* * Function Name : GPIO_Toggle_INIT * Description : Initializes GPIOA.0 * Input : None * Return : None *******************************************************************************/ void GPIO_Toggle_INIT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); } /******************************************************************************* * Function Name : main * Description : Main program. * Input : None * Return : None *******************************************************************************/ int main(void) { u8 i=0; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); Delay_Init(); USART_Printf_Init(115200); printf("SystemClk:%d\r\n",SystemCoreClock); printf("GPIO Toggle TEST\r\n"); GPIO_Toggle_INIT(); while(1) { Delay_Ms(250); GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i==0) ? (i=Bit_SET):(i=Bit_RESET)); } } 将程序下载到板子,可以看到板子的LED灯开始闪亮了。   通过阅读开发板的资料发现这颗芯片的总线设计和ARM的总线非常的象,我猜想编程方法也应该相似。    

  • 2021-01-19
  • 回复了主题帖: 给小白的IPv6知识

    kirk 发表于 2021-1-19 09:35 之前研究IPV6 看的是contiki 里面原型,但是目前感觉实际用处不大吧,客户端支持IPV6 后,连接到互联网还是 ...
    不需要转换,ipv6目前大部分地区都支持的可以自接使用。我目前就能使用ipv6上网

  • 2021-01-18
  • 回复了主题帖: 测评入围名单:沁恒RISC-V架构32位通用MCU CH32V103有奖评测

    信息确认无误!感谢沁恒和EEWORLD BBS,我会努力完成全部实验

  • 回复了主题帖: 更好的你我,更好的EEWorld!2020年终庆典

    确认个人信息无误,感谢EEWORLD论坛!以后更加努力。

  • 2021-01-16
  • 回复了主题帖: 搞事情预警~~~~啦啦啦~快进帖前排了解

    本帖最后由 bigbat 于 2021-1-16 17:33 编辑 我觉得是 “米尔” 进来看看

发布的博客

统计信息

已有568人来访过

  • 芯币:2064
  • 好友:3
  • 主题:229
  • 回复:957
  • 课时:--
  • 资源:2

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言