Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)

воскресенье, 8 февраля 2015 г.

DMA to USART (UART) OUT

Вывод на USART1 c использованием DMA буфера, без участия процессора


#include "stm32f10x.h"
/*******************************************************************/
#define BAUDRATE 115200
#define DMA_BUFFER_SIZE 8
uint32_t TimingDelay;
uint32_t mlsec;
DMA_InitTypeDef dma;
uint8_t dataBuffer[8] = {'0', '1', '2', '3', '4', '5', '6', '7'};// '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
uint8_t   dt[16];
/*******************************************************************/
void RCC_Configuration(void)
{
  // Enable HSE
RCC->CR|=RCC_CR_HSEON;
//RTC
RCC->CR|=RCC_BDCR_RTCSEL;
RCC->CR|=RCC_BDCR_RTCEN;
  // Flash 1 wait state
FLASH->ACR=FLASH_ACR_PRFTBE|FLASH_ACR_LATENCY_2;
// USB clock=PLLCLK, HCLK=SYSCLK, PCLK2=HCLK, PCLK1=HCLK/2, PLLCLK=8MHz*9=72MHz
RCC->CFGR=RCC_CFGR_USBPRE|RCC_CFGR_PLLMULL9|RCC_CFGR_PLLSRC_HSE|RCC_CFGR_PPRE1_DIV2;
  // Wait till HSE is ready
while ((RCC->CR&RCC_CR_HSERDY)==0);
  // Enable PLL
RCC->CR|=RCC_CR_PLLON;
// Wait till PLL is ready
while ((RCC->CR&RCC_CR_PLLRDY)==0);
// Select PLL as system clock source
RCC->CFGR|=RCC_CFGR_SW_PLL;
// Wait till PLL is used as system clock source
while ((RCC->CFGR&RCC_CFGR_SWS)!=RCC_CFGR_SWS_PLL);
// APB1ENR SPI2 clock enable
RCC->APB1ENR=RCC_APB1ENR_SPI2EN|RCC_APB1ENR_TIM2EN;
// APB2ENR SPI1, TIM1, GPIOC, GPIOB, GPIOA, AFIO clock enable
RCC->APB2ENR=RCC_APB2ENR_SPI1EN|RCC_APB2ENR_TIM1EN|RCC_APB2ENR_IOPCEN|RCC_APB2ENR_IOPBEN|RCC_APB2ENR_IOPAEN|RCC_APB2ENR_AFIOEN;
// AHBENR DMA1 clock enable
RCC->AHBENR=RCC_AHBENR_DMA1EN;
// PWR_CR
PWR->CR=PWR_CR_PLS_2V5|PWR_CR_PVDE;
}
void initAll(void)
{
GPIO_InitTypeDef port;
USART_InitTypeDef usart;

/*******************************************************************/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);
dma.DMA_MemoryBaseAddr = (uint32_t)&dataBuffer[0];
dma.DMA_DIR = DMA_DIR_PeripheralDST;
dma.DMA_BufferSize = DMA_BUFFER_SIZE;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_Init(DMA1_Channel4, &dma);

GPIO_StructInit(&port);
port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_9;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

port.GPIO_Mode = GPIO_Mode_AF_PP;
port.GPIO_Pin = GPIO_Pin_10;
port.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &port);

USART_StructInit(&usart);
usart.USART_BaudRate = BAUDRATE;
USART_Init(USART1, &usart);

//while(USART1->SR & USART_SR_RXNE) USART1->DR; //Зачистка буферов

DMA1_Channel5->CCR = 0; //запретить работу канала
DMA1_Channel5->CPAR = (uint32_t)dt;
DMA1_Channel5->CMAR = (uint32_t)&USART1->DR; //адрес буфера в памяти
DMA1_Channel5->CNDTR = 16; //загрузить количество данных для обмена

DMA1->IFCR |= DMA1_FLAG_TC5;
USART_ClearFlag(USART1, USART_FLAG_RXNE|USART_FLAG_IDLE);
DMA1_Channel5->CCR = DMA_CCR5_MINC|DMA_CCR5_EN; //разрешить работу канала
}
void Delay_ms(__IO uint32_t nTime)

  TimingDelay = nTime;
  while(TimingDelay != 0)
{
TimingDelay--;
}
}
//==========================================================================
int main()
{
    __enable_irq();
RCC_Configuration();
    initAll();
SysTick_Config(60000);
    USART_Cmd(USART1, ENABLE);
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    DMA_Cmd(DMA1_Channel4, ENABLE);
 while(1)
 {
/* Delay_ms(0x800000);
DMA_Cmd(DMA1_Channel4, DISABLE);  
DMA1_Channel4->CNDTR = 8;
DMA1->IFCR=0;
DMA_Cmd(DMA1_Channel4, ENABLE);  
*/  
 }
}

void SysTick_Handler(void)
{
mlsec++;
if(mlsec==1000)
{
mlsec=0;
// dma.DMA_MemoryBaseAddr = (uint32_t)&dataBuffer[0];
DMA_Cmd(DMA1_Channel4, DISABLE);
DMA1_Channel4->CNDTR = 8;
DMA1->IFCR=0;
DMA_Cmd(DMA1_Channel4, ENABLE);  
 
}
}

Комментариев нет:

Отправить комментарий