, ! .


»  » STM32: » USART DMA


USART DMA

1 12 12

1

- 1 dma "i am dma".
, -  . DMA 1 . ?

:
#include "stm32f10x.h"
#define led_off  (GPIOC->BSRR = GPIO_BSRR_BS13)   // Set PB4 bit
#define led_on (GPIOC->BSRR = GPIO_BSRR_BR13)  // Reset PB5 bit
#define APBCLK 72000000
#define BAUDRATE 256000
char RxBuff[64];
char TxBuff[] = "i am dma";
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void init_rcc(void)
{
  if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL)  //USE PLL?
  { 
   RCC->CFGR &= (uint32_t) (~RCC_CFGR_SW); //IF YES: OFF PLL/ON HSI
   while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI){} //WAIT HSI ON
   }
   RCC->CR |= ((uint32_t)RCC_CR_HSEON);//HSE ON
   while((RCC->CR & RCC_CR_HSERDY) == 0){}//WAIT HSE ON
   RCC->CR &= (uint32_t)(~RCC_CR_PLLON);//PLL ON
   while((RCC->CR & RCC_CR_PLLRDY) != 0) {};//WAIT PLL ON
   FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_2;
   RCC->CFGR |= RCC_CFGR_PLLSRC;//INPUT PLL HSI/HSE
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PLLMULL)) | (RCC_CFGR_PLLMULL9);//pll*9=72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_HPRE )) | (RCC_CFGR_HPRE_DIV1);//AHB * 1  = HCLK = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PPRE1)) | (RCC_CFGR_PPRE1_DIV2); //APB1 / 2 = 36Mhz; TIMER = *2 = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PPRE2)) | (RCC_CFGR_PPRE2_DIV1);//APB2 *1 = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_ADCPRE))|(RCC_CFGR_ADCPRE_DIV6);//adc/6=12Mhz
   RCC->CR |= RCC_CR_PLLON; 
   while((RCC->CR & RCC_CR_PLLRDY) == 0){};
   RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL);
   while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {};
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
  init_rcc(); 
  RCC->APB2ENR |=  RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN;//CLOCK TO PORTC /LED/port usart/altgpio
  RCC->AHBENR |=RCC_AHBENR_DMA1EN;
  GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);//CLEAR CONF /PUSH_PUL/LED
  GPIOC->CRH |= GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0;//Output mode, max speed 50 MHz/LED
  GPIOA->CRH	&= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);// Clear CONF USART ALTGPIO
  GPIOA->CRH	|= GPIO_CRH_CNF9_1;// ALTGPIO = USART1 PUSH-PULL OUT
  GPIOA->CRH	|= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;//ALTGPIO OUT MAX SPEED 50MHZ
  RCC->APB2ENR |=  RCC_APB2ENR_USART1EN;
  USART1->BRR =(APBCLK+BAUDRATE/2)/BAUDRATE;
  USART1->CR1 |= USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
  USART1->CR3 |= USART_CR3_DMAT; 
  
  DMA1_Channel4->CPAR = (uint32_t) (&(USART1->DR)) ;   
  
  DMA1_Channel4->CMAR = (uint32_t) TxBuff;  
 
  DMA1_Channel4->CNDTR = sizeof(TxBuff);                        

  DMA1_Channel4->CCR = DMA_CCR4_DIR | DMA_CCR4_MINC; 
  
  DMA1_Channel4->CCR |= DMA_CCR4_TEIE;           

  NVIC_EnableIRQ (DMA1_Channel4_IRQn);             
  
                    
  DMA1_Channel4->CCR |= DMA_CCR4_EN;
  while(1);
  return 0;
}

void DMA1_Channel4_IRQHandler (void)
{
  if(DMA1->ISR & DMA_ISR_TCIF4) { }     
 
  if(DMA1->ISR & DMA_ISR_HTIF4) { }     
 
  if(DMA1->ISR & DMA_ISR_TEIF4) { } 

2

,

:
USART1->CR1 |= USART_CR1_TE | USART_CR1_UE ;

000, DMA

:
DMA1_Channel4->CCR |= DMA_CCR4_EN;

().
? DMA . DR. ?

3

.

:
RCC->APB2ENR |=  RCC_APB2ENR_USART1EN

.

:
  RCC->APB2ENR |=  RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN |RCC_APB2ENR_USART1EN;//CLOCK TO PORTC /LED/port usart/altgpio
  RCC->AHBENR |=RCC_AHBENR_DMA1EN;
  GPIOC->CRH &= ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13);//CLEAR CONF /PUSH_PUL/LED
  GPIOC->CRH |= GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0;//Output mode, max speed 50 MHz/LED
  GPIOA->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_MODE9);// Clear CONF USART ALTGPIO
  GPIOA->CRH |= GPIO_CRH_CNF9_1;// ALTGPIO = USART1 PUSH-PULL OUT
  GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;//ALTGPIO OUT MAX SPEED 50MHZ
  USART1->BRR = ( APBCLK + BAUDRATE / 2 ) / BAUDRATE; 
  USART1->CR1 |= USART_CR1_TE | USART_CR1_UE;
  USART1->CR3 |= USART_CR3_DMAT;
  DMA1_Channel4->CPAR = (uint32_t) &USART1->DR ;   
  DMA1_Channel4->CMAR = (uint32_t) &TxBuff[0];  
  DMA1_Channel4->CNDTR = sizeof(TxBuff)-1;                        
  DMA1_Channel4->CCR = DMA_CCR4_DIR | DMA_CCR4_MINC;                                
  DMA1_Channel4->CCR |= DMA_CCR4_EN;

(2017-09-28 21:11:49)

4

5



:
  GPIOA->CRH |= GPIO_CRH_CNF9_1;// ALTGPIO = USART1 PUSH-PULL OUT
  GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;//ALTGPIO OUT MAX SPEED 50MHZ

.. volatile, . , .

?

:
DMA1_Channel4->CNDTR = sizeof(TxBuff)-1;

MasterElectric (2017-09-29 09:44:58)

6

MasterElectric ():


.. volatile, . , .

?

MasterElectric ( 07:44:58)

:
GPIOA->CRH |= GPIO_CRH_CNF9_1;// ALTGPIO = USART1 PUSH-PULL OUT
  GPIOA->CRH |= GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;//ALTGPIO OUT MAX SPEED 50MHZ

? ? " "? .
, , , ( ). - .
sizeof - + , . .

(2017-09-29 14:25:20)

7

,  .
  .

, ?

...

8

dosikus ():

, .
.

, ?

...

. ( - ). . . HC-SR04. .
- , . .

(2017-09-29 23:57:43)

9


, , CNF MODE, .

:
GPIOA->CRH = (GPIOA->CRH & ~(GPIO_CRH_MODE8 | GPIO_CRH_CNF8)) | GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1;

10 , .. , .

MasterElectric (2017-09-30 13:13:38)

10

():

. ( - ). . . HC-SR04. .
- , . .

(2017-09-29 23:57:43)

... (usb-lpt) usb  ?  ?  ? ?

ccc B2020
( , )

11

Atomic-dm ():

... (usb-lpt) usb ? ? ? ?

ccc B2020
( , )

. , . ...

12

:
////////////////////////////////////////////////////////////////////////////////
#include "stm32f10x.h"//  .
////////////////////////////////////////////////////////////////////////////////
#define TRIGER_H  (GPIOC->BSRR = GPIO_BSRR_BS13)
#define TRIGER_L (GPIOC->BSRR = GPIO_BSRR_BR13)  
/////////1/////////////////////////////////////////////////////////////////
#define APBCLK 72000000
#define BAUDRATE 256000
////////////////////////////////////////////////////////////////////////////////
////////     ////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#define time_h 83 //       - 10
#define time_l 220890 //    - 25
////////////////////////////////////////////////////////////////////////////////
//////////////////////// ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
volatile char TxBuff[64];
volatile uint32_t l;
////////////////////////////////////////////////////////////////////////////////
///////////////////////     ///////////////////////
////////////////////////////////////////////////////////////////////////////////
void init_rcc(void)
{
  if ((RCC->CFGR & RCC_CFGR_SWS) == RCC_CFGR_SWS_PLL)  //USE PLL?
  { 
   RCC->CFGR &= (uint32_t) (~RCC_CFGR_SW); //IF YES: OFF PLL/ON HSI
   while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI){} //WAIT HSI ON
   }
   RCC->CR |= ((uint32_t)RCC_CR_HSEON);//HSE ON
   while((RCC->CR & RCC_CR_HSERDY) == 0){}//WAIT HSE ON
   RCC->CR &= (uint32_t)(~RCC_CR_PLLON);//PLL ON
   while((RCC->CR & RCC_CR_PLLRDY) != 0) {};//WAIT PLL ON
   FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY_2;
   RCC->CFGR |= RCC_CFGR_PLLSRC;//INPUT PLL HSI/HSE
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PLLMULL)) | (RCC_CFGR_PLLMULL9);//pll*9=72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_HPRE )) | (RCC_CFGR_HPRE_DIV1);//AHB * 1  = HCLK = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PPRE1)) | (RCC_CFGR_PPRE1_DIV2); //APB1 / 2 = 36Mhz; TIMER = *2 = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_PPRE2)) | (RCC_CFGR_PPRE2_DIV1);//APB2 *1 = 72Mhz
   RCC->CFGR = (RCC->CFGR & (~RCC_CFGR_ADCPRE)) | (RCC_CFGR_ADCPRE_DIV6);//adc/6=12Mhz
   RCC->CR |= RCC_CR_PLLON; 
   while((RCC->CR & RCC_CR_PLLRDY) == 0){};//     PLL
   RCC->CFGR |= (uint32_t) (RCC_CFGR_SW_PLL);
   while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_PLL) {};//    C  PLL
}
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////  //////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void init_pin_all()
{
  //////////////////////   /////////////////////////////
  //CNF1(0) CNF0(0) MODE1(0) MODE0(0) =  ///////////////////////// 
  //CNF1(0) CNF0(1) MODE1(0) MODE0(0) =   //   /
  //CNF1(1) CNF0(0) MODE1(0) MODE0(0) =     UP  DOWN//
  //CNF1(0) CNF0(0) MODE1() MODE0() =  PUSH-PULL/////////////////
  //CNF1(0) CNF0(1) MODE1() MODE0() =   /////////////
  //CNF1(1) CNF0(0) MODE1() MODE0() =  . PUSH-PUL///////////
  //CNF1(1) CNF0(1) MODE1() MODE0() =  .  //////
  //MODE1(0) MODE0(0) = //  /////////////////////////////
  //MODE1(0) MODE0(1) =  10/////////////////////////////////////////////
  //MODE1(1) MODE0(0) =  2//////////////////////////////////////////////
  //MODE1(1) MODE0(1) =  50///////////////////////////////////////////// 
  //////////////////////////////////////////////////////////////////////////////
  /*  13 
                                         CNF1(0) CNF0(0)
    PUSH-PULL 50                                                         MODE1(1) MODE0(1)   */
  GPIOC->CRH = (GPIOA->CRH & ~(GPIO_CRH_MODE13 | GPIO_CRH_CNF13)) | GPIO_CRH_CNF13_0 | GPIO_CRH_MODE13_1 | GPIO_CRH_MODE13_0 ;
////////////////////////////////////////////////////////////////////////////////
  ////  1    //ECHO/////////////////////////////
  GPIOC->CRL = (GPIOA->CRL & ~(GPIO_CRL_MODE1 | GPIO_CRL_CNF1)) | GPIO_CRL_CNF0_0 ;
  //////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////////
/////////////// 1  DMA/////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void init_usart1_dma(void)
{
////////////////////////////////////////////////////////////////////////////////
////  -, -,   -,  1////////////////
////////////////////////////////////////////////////////////////////////////////
  RCC->APB2ENR |=  RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_USART1EN;
////////////////////////////////////////////////////////////////////////////////
////   //////////////////////////////////////////////////////
  RCC->AHBENR |=RCC_AHBENR_DMA1EN;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////  9   PUSH-PULL -//1////////////////
////////////////////////////////////////////////////////////////////////////////
  GPIOA->CRH = (GPIOA->CRH & ~(GPIO_CRH_MODE9 | GPIO_CRH_CNF9)) | GPIO_CRH_MODE9_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_CNF9_1 ;
////////////////////////////////////////////////////////////////////////////////
  USART1->BRR = ( APBCLK + BAUDRATE / 2 ) / BAUDRATE; 
  USART1->CR1 |= USART_CR1_TE | USART_CR1_UE;
  USART1->CR3 |= USART_CR3_DMAT;
  DMA1_Channel4->CPAR = (uint32_t) &USART1->DR ;                           
  DMA1_Channel4->CCR = DMA_CCR4_DIR | DMA_CCR4_MINC; 
  DMA1_Channel4->CCR |= DMA_CCR4_TCIE;
  NVIC_EnableIRQ (DMA1_Channel4_IRQn);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void send_dma(char *text, uint32_t tl)
{
  uint8_t i = 0;
  do
  {
    TxBuff[i]=*text++;
  }
  while(TxBuff[i++]);
  TxBuff[i-1] = tl/100;
  TxBuff[i++] = (tl%100)/10;
  TxBuff[i++] = tl%10;
  DMA1_Channel4->CMAR = (uint32_t) &TxBuff;
  DMA1_Channel4->CNDTR = i; 
  DMA1_Channel4->CCR |= DMA_CCR4_EN; 
}
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////  //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void SysTick_Handler(void)
{
  if(GPIOC->IDR & GPIO_IDR_IDR13)
/*    11,    
 -       1.
    ,   
    ,   
   1   . */
  {
    TRIGER_L;
    SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk;
  }
/*   */
  else
  {
    TRIGER_H;
    SysTick->LOAD = time_h;//     >10.     .
    SysTick->VAL = 0;//  (   ,     time_l.
/*              72               */                                                                 
    SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Pos | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
  }
}
////////////////////////////////////////////////////////////////////////////////
// -    1 ->L  L->H/////////////////////////
////////////////////////////////////////////////////////////////////////////////
void EXTI1_IRQHandler(void)
{
  uint32_t tl;
   EXTI->PR |= EXTI_PR_PR1; //  
   if(GPIOA->IDR & GPIO_IDR_IDR1)
/* 1          */
   {
     SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//  
     SysTick->LOAD = 16777215;//   
     SysTick->VAL = 0;//  
     SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//  
   }
   else
/* 1    -  .  . 
      25mC    */
   {
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;//  
    tl = (16777215 - SysTick->VAL);//   
    if(time_l>tl)
    {
      SysTick->LOAD = time_l - tl;
    }
    else
    {
      SysTick->LOAD = time_l;
    }
    SysTick->VAL = 0;//  (   ,     time_l.
/*              72               */                                                                 
    SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Pos | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
       l = tl>>9;
 //   l = tl/320;
    send_dma("distance =", l);
   }
}
////////////////////////////////////////////////////////////////////////////////
// DMA   //////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void DMA1_Channel4_IRQHandler (void)
{
  //  
  if(DMA1->ISR & DMA_ISR_TCIF4) 
  {
    DMA1_Channel4->CCR &= ~DMA_CCR4_EN;// DMA
    DMA1->IFCR |= DMA_IFCR_CTCIF4;//     
  }   
}
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
int main()
{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
  init_rcc(); 
  init_usart1_dma();
  init_pin_all();
////////////////////////////////////////////////////////////////////////////////
////////////////////////////// //////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/* 24 ,       0x00000001  0x00FFFFFF.
   N-1, . .     100 ,   99.
    . */
  SysTick->LOAD = time_h;
  SysTick->VAL = 0;
/*            72/8               */                                                                 
  SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Pos | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
////////////////////////////////////////////////////////////////////////////////
///     H->L  L->H   1 ///////////// 
  AFIO->EXTICR[0] = AFIO_EXTICR1_EXTI1_PA; //    1
  EXTI->IMR = EXTI_IMR_MR1; //    
  EXTI->RTSR = EXTI_RTSR_TR1; //   
  EXTI->FTSR = EXTI_FTSR_TR1; //   
  NVIC_EnableIRQ(EXTI1_IRQn);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
  while(1);
}

- HC-SR04.
http://se.uploads.ru/t/aBHEm.png
http://sh.uploads.ru/t/oZhOY.png
http://s2.uploads.ru/t/bT3cu.png

(2017-10-08 14:18:02)


»  » STM32: » USART DMA