1 | void Stepper_Init(void)
|
2 | {
|
3 | GPIO_InitTypeDef GPIO_InitStructure;
|
4 |
|
5 | /* TIM2 clock enable */
|
6 | RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
|
7 | /* GPIOA clock enable */
|
8 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
|
9 | /* GPIOC clock enable */
|
10 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
|
11 | /* Enable DMA1 clock */
|
12 | RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
|
13 |
|
14 | RCC_AHBPeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
|
15 |
|
16 | /* GPIOA Configuration:TIM2 Channel1 in Output */
|
17 |
|
18 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
|
19 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /*AF Alternate Function*/
|
20 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
21 |
|
22 | GPIO_Init(GPIOA, &GPIO_InitStructure);
|
23 |
|
24 | /* ---------------------------------------------------------------
|
25 | TIM2 Configuration: Output Compare Toggle Mode:
|
26 | --------------------------------------------------------------- */
|
27 | TIM_DeInit( TIM2 );
|
28 | TIM_TimeBaseStructInit( &TIM_TimeBaseStructure );
|
29 | TIM_OCStructInit( &TIM_OCInitStructure );
|
30 |
|
31 | /* Time base configuration */
|
32 | TIM_TimeBaseStructure.TIM_Period =60000;
|
33 | TIM_TimeBaseStructure.TIM_Prescaler = 2;
|
34 | TIM_OCInitStructure.TIM_Pulse = 0;
|
35 | TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
36 | TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
|
37 |
|
38 | TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
|
39 |
|
40 | /* Output Compare Toggle Mode configuration: Channel4 */
|
41 | TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Toggle;
|
42 | TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
|
43 | TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
|
44 | TIM_OC4Init(TIM2, &TIM_OCInitStructure);
|
45 |
|
46 | TIM_ARRPreloadConfig(TIM2, ENABLE);
|
47 |
|
48 |
|
49 | /* -------------------------------------------------------------------
|
50 | DMA1 configuration
|
51 | ---------------------------------------------------------------------- */
|
52 |
|
53 | /* DMA1 channel2 configuration ----------------------------------*/
|
54 | DMA_DeInit(DMA1_Channel7);
|
55 | DMA_StructInit(&DMA_InitStructure);
|
56 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM2_BASE + 0x2C;
|
57 | DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&TIM2->ARR; //(uint32_t)TIM2_BASE + 0x2C; //(uint32_t)TIM2_ARR_Address;
|
58 | DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)SRC_Buffer_INC;
|
59 | DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
60 | DMA_InitStructure.DMA_BufferSize = BufferSize;
|
61 | DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
62 | DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
63 | DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
|
64 | DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
|
65 | DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
66 | DMA_InitStructure.DMA_Priority = DMA_Priority_High;
|
67 | DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
68 | DMA_Init(DMA1_Channel7, &DMA_InitStructure);
|
69 |
|
70 | /* Enable DMA1 Channel2 Transfer Complete interrupt */
|
71 | DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE);
|
72 |
|
73 | NVIC_InitTypeDef NVIC_InitStructure;
|
74 | NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;
|
75 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
76 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
77 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
78 | NVIC_Init(&NVIC_InitStructure);
|
79 |
|
80 |
|
81 | DMA_SetCurrDataCounter(DMA1_Channel7, BufferSize);
|
82 |
|
83 |
|
84 |
|
85 | /* Enable DMA1 Channel2 */
|
86 | DMA_Cmd(DMA1_Channel7, ENABLE);
|
87 |
|
88 | /* Enable TIM2 DMA update request */
|
89 | TIM_DMACmd(TIM2,TIM_DMA_Update, ENABLE);
|
90 |
|
91 | /* TIM enable counter */
|
92 | TIM_Cmd(TIM2, ENABLE);
|
93 | }
|