延迟
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