А в stm32f30x.h для флэша только два значения:
#define FLASH_ACR_LATENCY_0 ((uint8_t)0x01) /*!< Bit 0 */
#define FLASH_ACR_LATENCY_1 ((uint8_t)0x02) /*!< Bit 1 */
Надо поискать что для каких частот.
Код: Выделить всё
// DAC
DAC->CR = DAC_CR_EN1;
// TIM6 - Тактовый сигнал для ЦАП
TIM6->CR1 &= ~TIM_CR1_CEN; // disable
TIM6->CR1 = TIM_CR1_ARPE | TIM_CR1_URS ;
TIM6->CR2 = TIM_CR2_MMS_1; // 010: Update - The update event is selected as a trigger output (TRGO).
TIM6->PSC = 0;
TIM6->ARR = 10000-1; // 8MHz / 1000 = 8 kHz
TIM6->EGR |= TIM_EGR_UG; // Сформировать Update Event для загрузки регистров
TIM6->DIER = TIM_DIER_UIE; // | TIM_DIER_UDE;
TIM6->CR1 |= TIM_CR1_CEN ; //enable timerКод: Выделить всё
void TIM6_IRQHandler(void) {
const uint8_t sine_tab[] = {128, 218, 255, 218, 128, 38, 0, 38 };
static const uint8_t *tab_ptr;
TIM6->SR &= ~(TIM_SR_UIF);
if (flag.beep) {
DAC1->DHR8R1 = *tab_ptr++;
if (tab_ptr >= sine_tab + sizeof(sine_tab)) tab_ptr = sine_tab;
} else {
tab_ptr = sine_tab;
DAC1->DHR8R1 = *tab_ptr;
}
}
Код: Выделить всё
void start_sound(void) {
static const uint8_t sine_tab[] = {128, 218, 255, 218, 128, 38, 0, 38 };
DMA1_Channel3->CPAR = (uint32_t) (&(DAC1->DHR8R1));
DMA1_Channel3->CMAR = (uint32_t) sine_tab;
DMA1_Channel3->CNDTR = sizeof(sine_tab);
DMA1_Channel3->CCR = DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_DIR;
DMA1_Channel3->CCR |= DMA_CCR_EN;
DAC1->CR = DAC_CR_DMAEN1 | DAC_CR_TEN1 | DAC_CR_EN1;
}У твоего F051 не настолько много флеша, что в него влезали большие массивыИ еще вопрос, если я хочу разместить в памяти большой массив данных - как это сделать, не перегоняя в текстовый вид? Как бы сделать так, чтобы линкер простой raw файл закинул в память и слинковал с моей функцией. Хм, с адресом проблем особых не вижу, а вот с размером как быть?
Код: Выделить всё
#define FLASH_USER_START_ADDR ((uint32_t)0x08002800) /* Start @ of user Flash area */В нашем ларьке STM32F051C8 с 64К флэша стоит существенно дешевле чем STM32F051C6 с 32К, такое же и с F030У твоего F051 не настолько много флеша,
Я бы не писал, если бы у самого не работало.DMA с Flash вроде должен - из RM:
Код: Выделить всё
static int8_t CDC_Receive_HS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 11 */
USBD_CDC_SetRxBuffer(&hUsbDeviceHS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceHS);
return (USBD_OK);
/* USER CODE END 11 */
}