15回答

0收藏

GD32F190寄存器方式

GD32 GD32 6948 人阅读 | 15 人回复 | 2016-05-22

本帖最后由 糖悦之果飞 于 2016-5-23 17:28 编辑

几天的GD32学习,都是用库函数写程序,虽然编写很便利,但是整个代码变得臃肿.这里我准备编写寄存器方式的代码.
先给个IO的初始代码:


RCC->AHBCCR |= RCC_AHBCCR_PBEN;//时钟初始

GPIOB->OSPD |= 0xffffffff;//上拉?

GPIOB->PUPD |= 0x00555500;//IO速度
GPIOB->OMODE |= 0x0700;   //输出类型
GPIOB->CTLR |= 0x00555500;//输出模式
        
GPIOB->DOR |= 0x00000000; //输出内容

GPIOB->BOR |= 0x0400;//IO输出1
GPIOB->BCR |= 0x0400;//IO输出0
分享到:
回复

使用道具 举报

回答|共 15 个

倒序浏览

沙发

jwdxu2009

发表于 2016-5-22 22:31:19 | 只看该作者

下载下来,参考和学习
板凳

lcr12

发表于 2016-5-29 23:09:09 | 只看该作者

串口寄存器方式初始化:
void UsartInit(void)
{
          RCC->AHBCCR |= RCC_AHBCCR_PAEN;//IO
    RCC->APB1CCR |= RCC_APB1PERIPH_USART2;//USARTCLK
                GPIOA->AFS[0] = 0x1100;//IO AFS 2,3
       
          GPIOA->OSPD |= 0xffffffff;//speed
          GPIOA->PUPD |= 0x00555000;//up
          GPIOA->OMODE |= 0x0700;   //输出类型
          GPIOA->CTLR |= 0x005500a0;//输出模式
          GPIOA->DOR |= 0x00000000; //输出内容
          
          USART2->BRR = 0x000016c0;//9600@28MHZ
          USART2->CTLR1 |= 0x00001000;
          USART2->CTLR2 &= ~0x00003000;
          USART2->CTLR3 &= ~0x00002000;
          USART2->CTLR1 |= 0x00000400;//PCEN
          USART2->CTLR1 |= 0x000000a0;
          USART2->CTLR1 |= USART_CTLR1_UEN;
}
地板

lcr12

发表于 2016-5-29 23:10:46 | 只看该作者

          RCC->APB1CCR |= RCC_APB1PERIPH_TIMER6;
       
           //RCC->APB1RCR |= RCC_APB1PERIPH_TIMER6RST;
           //RCC->APB1RCR &= ~RCC_APB1PERIPH_TIMER6RST;
          TIMER6->STR = (uint16_t)~TIMER_INT_UPDATE;
          TIMER6->DIE |= TIMER_INT_UPDATE;
        TIMER6->CTLR1 |= TIMER_CTLR1_CNTE;
           TIMER6->CTLR1 = 0x0000;//控制方式
           //TIMER6->CTLR2 = 0x0020;//控制输出
           TIMER6->EVG = 0x0000;  //事件触发
           TIMER6->PSC = 0x0000;   //预分频数
           TIMER6->CARL = 0x007f; //重载
5#

lcr12

发表于 2016-5-29 23:11:16 | 只看该作者

定时器初始化寄存器
6#

lcr12

发表于 2016-5-29 23:12:41 | 只看该作者

void EXTI4_15_IRQHandler(void)
{
    if(((EXTI->PD & EXTI_LINE6) != (uint32_t)RESET) && ((EXTI->IER & EXTI_LINE6) != (uint32_t)RESET)){
                               
                           //GPIOB->BOR |= 0x0100;                          
    }
                EXTI->PD = EXTI_LINE6;
                if(((EXTI->PD & EXTI_LINE7) != (uint32_t)RESET) && ((EXTI->IER & EXTI_LINE7) != (uint32_t)RESET)){
                                             
                          //GPIOB->BOR |= 0x0200;
    }
                EXTI->PD = EXTI_LINE7;
}
外部中断寄存器方式
7#

lcr12

发表于 2016-6-6 23:19:16 | 只看该作者

继续讨论寄存器方式
8#

lcr12

发表于 2016-6-6 23:22:40 | 只看该作者

void UsartInit(void)
{
       
          RCC->AHBCCR |= RCC_AHBCCR_PAEN;//IO
    RCC->APB1CCR |= RCC_APB1PERIPH_USART2;//USARTCLK
                GPIOA->AFS[0] = 0x1100;//IO AFS 2,3
       
          GPIOA->OSPD |= 0xffffffff;//speed
          GPIOA->PUPD |= 0x00555000;//up
          GPIOA->OMODE |= 0x0700;   //?????à??
          GPIOA->CTLR |= 0x005500a0;//????????
          GPIOA->DOR |= 0x00000000; //????????
          
          USART2->BRR = 0x000016c0;//9600@28MHZ
          USART2->CTLR1 |= 0x00001000;
          USART2->CTLR2 &= ~0x00003000;
          USART2->CTLR3 &= ~0x00002000;
          USART2->CTLR1 |= 0x00000400;//PCEN
          USART2->CTLR1 |= 0x000000a0;
          USART2->CTLR1 |= USART_CTLR1_UEN;
       
                NVIC_SetPriorityGrouping(0x00000000);//??????????
                NVIC_EnableIRQ(USART2_IRQn);//????
}
9#

lcr12

发表于 2016-6-6 23:23:14 | 只看该作者

void USART2_IRQHandler(void)
{
    if ((USART2->STR & USART_FLAG_RBNE) != (uint16_t)RESET)
    {
        USART2->SCR = USART_FLAG_RBNE;
    }
                if ((USART2->STR & USART_FLAG_TBE) != (uint16_t)RESET)
    {
        USART2->SCR = USART_FLAG_TBE;
                          USART2->TDTR = (uint32_t)txbuf[txpt];
                          txpt = txpt + 1;
                          txpt &= 0x1f;
    }
}
10#

lcr12

发表于 2016-6-6 23:23:50 | 只看该作者

void TIMER6_DAC_IRQHandler(void)
{
    if(((TIMER6->STR & TIMER_INT_UPDATE) == (uint16_t)SET) && ((TIMER6->DIE & TIMER_INT_UPDATE) == (uint16_t)SET)){
                   TIMER6->STR = (uint16_t)~TIMER_INT_UPDATE;
                         tim[0] = tim[0] + 1;
                       
                }
}       
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条