TA的每日心情 | 开心 2019-6-20 14:08 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
|
不知道什么原因Perf-V IDE下中断无法工作,我实现的流水灯是使用查询方式下进行的,但是根据官方群技术支持工作人员所述是可以定时中断方式工作的,所以我便在虚拟机下进行了验证,果不其然其工作杠杠的(我在反向进行修改,将虚拟机下的工程移植到Perf-V IDE下,但是没有成功,这部分工作还将继续摸索中,究其原因还是不太喜欢linux下开发吧)。现总结如下。
1. 修改E203 SOC核,如前一贴所述。
2. 找到hifive1.h文件,修改对led0-3的宏定义,如下图1所示。hifive1.h路径如图1中红色框所示。
图1 hifive1.h文件 主程序如下所示。 - #include <stdio.h>
- #include <stdlib.h>
- #include "platform.h"
- #include <string.h>
- #include "plic/plic_driver.h"
- <font style="background-color: magenta;">#include "../../bsp/env/hifive1.h"</font>
- #include "encoding.h"
- #include <unistd.h>
- #include "stdatomic.h"
- #define uchar unsigned char
- #define uint unsigned int
- uint32_t count=0;
- uint32_t delay_mark=0;
- void delay(uint32_t times);
- void reset_demo (uint32_t times);
- void GPIO_SET(uint32_t pin_num,uint32_t pin_val,uint32_t pin_model);
- // Structures for registering different interrupt handlers
- // for different parts of the application.
- typedef void (*function_ptr_t) (void);
- void no_interrupt_handler (void) {};
- function_ptr_t g_ext_interrupt_handlers[PLIC_NUM_INTERRUPTS];
- // Instance data for the PLIC.
- plic_instance_t g_plic;
- /*Entry Point for PLIC Interrupt Handler*/
- void handle_m_ext_interrupt(){
- plic_source int_num = PLIC_claim_interrupt(&g_plic);
- if ((int_num >=1 ) && (int_num < PLIC_NUM_INTERRUPTS)) {
- g_ext_interrupt_handlers[int_num]();
- }
- else {
- exit(1 + (uintptr_t) int_num);
- }
- PLIC_complete_interrupt(&g_plic, int_num);
- }
-
- /*Entry Point for Machine Timer Interrupt Handler*/
- void handle_m_time_interrupt(){
-
- clear_csr(mie, MIP_MTIP);
- volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME);
- volatile uint64_t * mtimecmp = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP);
- uint64_t now = *mtime;
- uint64_t then = now +0.5* RTC_FREQ;
- *mtimecmp = then;
- count++;
-
- if(count==1)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD5_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD6_r));
-
- GPIO_SET(led1,0,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==2)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD5_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD6_g));
-
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,0,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==3)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_b));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD5_b));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD6_b));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,0,output);
- GPIO_SET(led4,1,output);
- }
- if(count==4)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD4_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD4_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_b));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,0,output);
- }
- if(count==5)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD5_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD5_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD5_b));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==6)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD6_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD6_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD6_b));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,0,output);
- GPIO_SET(led4,1,output);
- }
- if(count==7)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD5_r));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD6_r));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,0,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==8)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD5_g));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD6_g));
- GPIO_SET(led1,0,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==9)
- {
- uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_b));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD5_b));
- GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x0 << ledD6_b));
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
- GPIO_SET(led4,1,output);
- }
- if(count==9)
- {
- count=0;
- }
- // read the current value of the LEDS and invert them.
-
- // uint32_t leds = GPIO_REG(GPIO_OUTPUT_VAL);
- // GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << BLUE_LED_OFFSET));
-
-
- //GPIO_REG(GPIO_OUTPUT_VAL) ^= ((0x1 << ledD4_r));
- // Re-enable the timer interrupt.
- <font style="background-color: darkorchid;"> set_csr(mie, MIP_MTIP);</font>
-
- }
- void print_instructions() {
- //write (STDOUT_FILENO, instructions_msg, strlen(instructions_msg));
- //write (STDOUT_FILENO, instructions_msg_sirv, strlen(instructions_msg_sirv));
- // printf ("%s",instructions_msg_sirv);
- }
- void reset_demo (uint32_t times){
- // Disable the machine & timer interrupts until setup is done.
- clear_csr(mie, MIP_MEIP);
- clear_csr(mie, MIP_MTIP);
- for (int ii = 0; ii < PLIC_NUM_INTERRUPTS; ii ++){
- g_ext_interrupt_handlers[ii] = no_interrupt_handler;
- }
- // Set the machine timer to go off in 3 seconds.
-
- volatile uint64_t * mtime = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIME);
- volatile uint64_t * mtimecmp = (uint64_t*) (CLINT_CTRL_ADDR + CLINT_MTIMECMP);
- uint64_t now = *mtime;
- uint64_t then = now + times*RTC_FREQ;
- *mtimecmp = then;
- // Enable the Machine-External bit in MIE
- <font style="background-color: orange;"> set_csr(mie, MIP_MEIP);</font>
- // Enable the Machine-Timer bit in MIE
- <font style="background-color: orange;"> set_csr(mie, MIP_MTIP);</font>
- // Enable interrupts in general.
- <font color="black" style="background-color: orange;"> set_csr(mstatus, MSTATUS_MIE);</font>
- }
- void GPIO_SET(uint32_t pin_num,uint32_t pin_val,uint32_t pin_model)
- {
- if(pin_model==output)
- {
- GPIO_REG(GPIO_OUTPUT_EN) |= (0x01<<pin_num);
- if(pin_val==1)
- {
- GPIO_REG(GPIO_OUTPUT_VAL) |=(0x01<<pin_num);
- }
- if(pin_val==0)
- {
- GPIO_REG(GPIO_OUTPUT_VAL) &=~(0x01<<pin_num);
- }
- }
- if(pin_model==input)
- {
- GPIO_REG(GPIO_INPUT_EN) |= (0x01<<pin_num);
- }
- }
- int main(int argc, char **argv)
- {
-
-
- /**************************************************************************
- * Set up the PLIC
- *
- *************************************************************************/
- PLIC_init(&g_plic,
- PLIC_CTRL_ADDR,
- PLIC_NUM_INTERRUPTS,
- PLIC_NUM_PRIORITIES);
- reset_demo(1);
- GPIO_SET(ledD4_r,1,output);
- GPIO_SET(ledD4_g,1,output);
- GPIO_SET(ledD4_b,1,output);
- GPIO_SET(ledD5_r,1,output);
- GPIO_SET(ledD5_g,1,output);
- GPIO_SET(ledD5_b,1,output);
- GPIO_SET(ledD6_r,1,output);
- GPIO_SET(ledD6_g,1,output);
- GPIO_SET(ledD6_b,1,output);
-
- GPIO_SET(led4,1,output);
- GPIO_SET(led1,1,output);
- GPIO_SET(led2,1,output);
- GPIO_SET(led3,1,output);
-
- //GPIO_SET(BLUE_LED_OFFSET,1,output);
- while (1){
-
-
- }
-
- return 0;
- }
复制代码 3. 执行编译命令。 - make software PROGRAM=demo_gpio BOARD=Perf-V-creative-board
复制代码 4. 执行加载命令。 - make upload PROGRAM=demo_gpio BOARD=Perf-V-creative-board
复制代码 5. 效果如下。
|
|