延遲
LL_mDelay 基於systic的
串口
https://blog.csdn.net/qq_45474612/article/details/100881454
https://www.cnblogs.com/amw2738/p/STM32F0.html
https://blog.csdn.net/weixin_42067548/article/details/105099049
串口DMA
https://blog.csdn.net/songskygo/article/details/89568679
定時
https://blog.csdn.net/lljss1980/article/details/105003608
定時捕獲
https://www.eemaker.com/stm32-ll-lib-timer.html
Flash的LL庫要自己寫
https://blog.csdn.net/qq_45474612/article/details/101222222
YMODEM IAP
https://blog.csdn.net/qq_45474612/article/details/101221981
DHT11
https://blog.csdn.net/qq_45474612/article/details/99065861
static void usDelay(uint8_t x) //毫秒延遲,我開了一個定時器,但是我沒有開中斷,會有一點誤差,但是不會太大
{
LL_TIM_DisableCounter(TIM1);
LL_TIM_SetCounter(TIM1, 0);
LL_TIM_EnableCounter(TIM1);
while (LL_TIM_GetCounter(TIM1) != x)
{
}
}
DMA
https://blog.csdn.net/qq_45474612/article/details/97888448
DMA:AD
https://www.cnblogs.com/foxclever/p/10289772.html
這部分做完,直接上代碼
#define ADC_DMA_BUF_CH 5 /* 通道數 */ #define ADC_DMA_BUF_LEN 8 /* 每個通道緩存數據 */ #define ADC_DMA_BUF_SIZE (ADC_DMA_BUF_LEN*ADC_DMA_BUF_CH) /* 總BUF大小 */ static uint16_t tAD[ADC_DMA_BUF_CH]; static uint16_t adcBuf[ADC_DMA_BUF_SIZE]; void adc_dma_init() { // LL_ADC_StartCalibration(ADC1); // while( LL_ADC_IsCalibrationOnGoing(ADC1)); // LL_ADC_Enable(ADC1); // LL_ADC_REG_StartConversion(ADC1); // LL_mDelay(2); LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1,ADC_DMA_BUF_SIZE); LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA)); LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)adcBuf); //LL_DMA_ConfigAddresses(DMA1,LL_DMA_CHANNEL_1,(uint32_t)&(ADC1->DR),(uint32_t) &adcBuf,LL_DMA_DIRECTION_PERIPH_TO_MEMORY); // LL_ADC_REG_SetDMATransfer(ADC1,LL_ADC_REG_DMA_TRANSFER_UNLIMITED); uint32_t dma_transfer = LL_ADC_REG_GetDMATransfer(ADC1); LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_NONE); LL_ADC_StartCalibration(ADC1); while (LL_ADC_IsCalibrationOnGoing(ADC1)) ; LL_ADC_REG_SetDMATransfer(ADC1, dma_transfer); LL_ADC_Enable(ADC1); LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); LL_ADC_REG_StartConversion(ADC1); //LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1); } uint8_t adc_get( uint16_t *adc_data_buf) { if ( LL_DMA_IsActiveFlag_TC1(DMA1) ) { uint16_t i,j; uint16_t * tadBuf; tadBuf = & adcBuf[0]; for(i = 0; i < ADC_DMA_BUF_CH; i++) { tAD[i] = 0; } /* 這里對數據做一下平均 */ for(i = 0; i < ADC_DMA_BUF_CH; i++) { for(j = 0; j < ADC_DMA_BUF_LEN; j++) { tAD[i] = tAD[i] + tadBuf[j*ADC_DMA_BUF_CH + i]; } tAD[i] = tAD[i] / ADC_DMA_BUF_LEN; } // printf("\r\n tAD[0]=%d tAD[1]=%d tAD[2]=%d tAD[3]=%d tAD[4]=%d \r\n",tAD[0],tAD[1],tAD[2],tAD[3],tAD[4]); memcpy(adc_data_buf,tAD,ADC_DMA_BUF_CH*2); /* 注意memcpy 還是用8位數據 */ return 1; } return 0; }
SPI
https://www.cnblogs.com/foxclever/p/10257447.html 注意自己加 LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER); 8位
標准庫:https://blog.csdn.net/qq_24835087/article/details/103803860 注意SPI_RxFIFOThresholdConfig 8位
/* 注意啟用一下 */ LL_SPI_SetRxFIFOThreshold(SPI1,LL_SPI_RX_FIFO_TH_QUARTER); LL_SPI_Enable( SPI1 );
/* 讀取數據 */ static uint8_t dev_flash_read_write_byte(uint8_t tx_data) { uint16_t retry=0; while (LL_SPI_IsActiveFlag_TXE( SPI1 ) == RESET) { retry++; if(retry>20000)return 0; } LL_SPI_TransmitData8(SPI1,tx_data); retry=0; while (LL_SPI_IsActiveFlag_RXNE( SPI1 ) == RESET) { retry++; if(retry>20000)return 0; } return (LL_SPI_ReceiveData8(SPI1)); }
可以做將一些時基放在SysTick_Handler里面
https://blog.csdn.net/qq_45474612/article/details/103045491