29.05.2012, 10:44
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Сообщение от qwerky
|
››и опора для АЦП
и что ? у большинства стабилизаторов точность 1%, и дрейф на уровне TL431. Есть и с лучшими параметрами, в кр.случае есть опоры в виде проходного стабилизатора. Или вы хотите как в АВР - точность плюс минус лапоть, и дрейф заметен даже при небольшом нагреве ? Я - нет, такая "опора" мне не нужна
|
Что сказать-то хотел? Что питать надо от прецизионного стабилизатора?
Сообщение от qwerky
|
››Вот такая засада
да, особенно там где ее нет
|
Просто вместо 3В батарейки надо взять 5В батарейку и стабилизатор воткнуть - никаких засад!
Последний раз редактировалось dccharacter; 29.05.2012 в 13:32.
|
|
|
|
30.05.2012, 04:20
|
|
Временная регистрация
Регистрация: 28.03.2010
Сообщений: 56
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Изучаем STM32 Cortex M3
Народ, подскажите - DMA шарашит с максимальной скоростью, в районе 5-ти мегагерц. Мне нужно чтобы по переполнению таймера было отослано одно слово. По следующему - еще одно. Так все шесть слов, потом по новой. Прерывания делал для отладки, вообще они мне (надеюсь) не нужны. Код:
PHP код:
|
#include "stm32f10x.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" #include "stm32f10x_tim.h" #include "stm32f10x_dma.h" #include "misc.h"
#define GPIOC_BSRR_Address GPIOC_BASE+0x10
void TIM_Configuration (void) { /** * TIM2 mocks Hall sensors output by consequently generating DMA request * to fetch from memory next state of three output pins * HallU - PC10 * HallV - PC11 * HallW - PC12 */ GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; DMA_InitTypeDef DMA_InitStructure;
uint32_t GPIO_PinsState[6] = { 134222848, 402654208, 268438528, 335546368, 67115008, 201330688 };
uint16_t TimerPeriod = (SystemCoreClock / 18000 ) - 1;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32) GPIOC_BSRR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32) GPIO_PinsState; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure); //TIM2_CH1 = Channel5
DMA_Cmd(DMA1_Channel5, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);*/
/*NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriori ty = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);*/
TIM_TimeBaseStructure.TIM_Period = TimerPeriod; TIM_TimeBaseStructure.TIM_Prescaler = 2; TIM_TimeBaseStructure.TIM_ClockDivision = 2; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //DMA_ITConfig(DMA1_Channel5, DMA1_Channel5_IRQn, ENABLE);
TIM_Cmd(TIM2, ENABLE);
TIM_DMACmd(TIM2, TIM_DMA_Update, ENABLE);
//GPIO_SetBits(GPIOC, GPIO_Pin_10 | GPIO_Pin_12); }
void TIM2_IRQHandler (void) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); GPIOC-›ODR ^= GPIO_Pin_9; }
void DMA1_Channel5_IRQHandler(void) { DMA_ClearITPendingBit(DMA1_IT_GL5); //GPIOC-›ODR ^= GPIO_Pin_8; GPIO_SetBits(GPIOC, GPIO_Pin_8); }
|
P.S. Такой красивый кросс-толк на осцилле!
P.P.S. Уже нашел две ошибки - 1) M2M работает без триггера и 2)М2М нельзя использовать одновременно с циркулар мод.
М2М отключил, ДМА вообще не работает.
P.P.P.S Все, отловил. TIM2_UP мне был нужен, а это второй канал а не пятый.
Спасибо, что были с нами сегодня. Спать.
Последний раз редактировалось dccharacter; 30.05.2012 в 04:44.
|
|
|
|
30.05.2012, 20:19
|
|
Прописка
Регистрация: 10.08.2010
Сообщений: 113
Сказал спасибо: 30
Сказали Спасибо 43 раз(а) в 26 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Подскажите кто может.
Пытаюсь запустить SPI.
пользуюсь STM32-Discovery + IAR
Для теста SPI ставлю перемычку MISO-MOSI.
Пока работаю в отладчике все работает как надо. Что посылаю то и принимаю.
Но как только делаю RESET или запускаю программу автономно все меняется.
Что бы я не отсылал в ответ приходит 0xFEFEFEFE. Что это за фокусы?
Перед инициализацией SPI я отключаю JTAG
Тактирование альтернативных функций включено
Пины портов настроены на альтернативные функции
Код:
|
void SPI_INIT()
{
// REMAP SPI
AFIO-›MAPR|=AFIO_MAPR_SPI1_REMAP;
// тактирование SPI
RCC-›APB2ENR |= RCC_APB2ENR_SPI1EN;
//настройка
SPI1-›CR1=0;
SPI1-›CR1 |=SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_CPHA | SPI_CR1_BR_1;
// включение SPI
SPI1-›CR1 |= SPI_CR1_SPE; |
для теста написал функцию
Немного длинно, но это заготовка для работы с конвертором TDC-GP2
Код:
|
uint32_t TEST_SPI(uint32_t data)
{
uint32_t recive;
PIN_OFF(TDCGP2_PORT,TDCGP2_SSN);
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = (data››24);
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_RXNE));
recive=SPI1-›DR;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = (data››16) & 0xFF;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_RXNE));
recive=(recive‹‹8) | SPI1-›DR;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = (data››8) & 0xFF;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_RXNE));
recive=(recive‹‹8) | SPI1-›DR;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_TXE));
SPI1-›DR = data & 0xFF;
while (SPI1-›SR & SPI_SR_BSY);
while (!(SPI1-›SR & SPI_SR_RXNE));
recive=(recive‹‹8) | SPI1-›DR;
PIN_ON(TDCGP2_PORT,TDCGP2_SSN);
return recive;
} |
|
|
|
|
30.05.2012, 20:28
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
avs2009, ловите рабочий код
Код:
|
void init_SPI (SPI_TypeDef* SPIx)
{
SPI_InitTypeDef SPI_InitStruct;
SPI_InitStruct.SPI_Direction=SPI_Direction_2Lines_ FullDuplex;
SPI_InitStruct.SPI_Mode=SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA=SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS=SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler=SPI_BaudRateP rescaler_2;
SPI_InitStruct.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial=7;
SPI_Init(SPIx, &SPI_InitStruct);
SPI_Cmd(SPIx, ENABLE);
}
void SPI_SendByte(SPI_TypeDef* SPIx,u16 byte)
{
u16 tmp=SPI_ReadByte(SPIx,byte);
}
u16 SPI_ReadByte(SPI_TypeDef* SPIx,u16 byte)
{
while (!(SPIx-›SR & 2));
SPIx-›DR=byte;
while (!(SPIx-›SR & 1));
return SPIx-›DR;
} |
Можете ковырнуть библиотеки и вытащить оттуда флаги и регистры.
|
|
|
|
30.05.2012, 21:51
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
SPI!!! Работать!!! Раз, два!!!
Сообщение от Easyrider83
|
Код:
|
while (!(SPIx-›SR & 2));
SPIx-›DR=byte;
while (!(SPIx-›SR & 1)); |
|
|
|
|
|
30.05.2012, 21:59
|
|
Прописка
Регистрация: 10.08.2010
Сообщений: 113
Сказал спасибо: 30
Сказали Спасибо 43 раз(а) в 26 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Easyrider83, Спасибо. Попробую поковырять и приделать к своей программе.
Но почему мой-то код только в отладчике работает?
st__1, а над этим подумаю завтра
Последний раз редактировалось avs2009; 30.05.2012 в 22:03.
|
|
|
|
30.05.2012, 22:17
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А чё там думать???
Код:
|
#define SPI_SR_RXNE ((uint8_t)0x01) /*!‹ Receive buffer Not Empty */
#define SPI_SR_TXE ((uint8_t)0x02) /*!‹ Transmit buffer Empty */ |
|
|
|
|
30.05.2012, 22:41
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от Easyrider83
|
ловите рабочий код
|
Уверены???
|
|
|
|
30.05.2012, 23:19
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
|
|
|
|
30.05.2012, 23:59
|
|
Заблокирован
Регистрация: 31.12.2011
Сообщений: 726
Сказал спасибо: 32
Сказали Спасибо 223 раз(а) в 162 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
А это зачем???
Код:
|
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
.
.
.
. |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:23.
|
|